繁体   English   中英

注释 printf 语句会停止输出

[英]commenting a printf statement stops output

我正在尝试编写 C 代码来执行一些数学计算。 我正在使用 printf 语句来检查打印变量。 当我完成代码并获得所需的输出时,我注释掉了该行。 但是,这样做之后,我没有得到任何输出。 取消注释该行会返回所需的输出。

#include <stdio.h>
#include <math.h>
#define M 1000

const double eps = 1.110223e-16;
const double delta = 1.110223e-16;

void bisection(double (*fn)(double), double a, double b) {
    //Bisection algorithm
    double w, c, u, v, e;
    int i;
    u = (*fn)(a);
    v = (*fn)(b);
    e = b - a;

    if(signbit(u) == signbit(v)) {
        printf("Stopping due to same sign\n");
        return;
    }

    for(i = 0; i < M; i++) {
        printf("%d\n", i);
        e = e / 2;
        c = a + e;
        w = (*fn)(c);

        //Stopping conditions epsilon and delta
        if(abs(e) <= eps || abs(w) <=  delta) {
            printf("Root is %e\n", c);
            return;
        }

        if(signbit(w) == signbit(u)) {
            //Means that root lies in [c,b]
            a = c;
            u = w;
        } else {
            // Means root lies in [a, b]
            b = c;
            v = w;
        }
    }

}

double problem_a(double x) {
    return (pow(x, -1) - tan(x));
}

int main(int argc, char *argv[])
{
    double (*fn)(double);
    fn = &problem_a;
    bisection(fn, 0.0 + eps, M_PI/2 - eps);
    return 0;
}

我得到的输出是: Root is 7.853982e-01 如果我评论文件,我不会得到任何输出。

我正在使用 gcc 编译器版本 4.8.3

这种行为的可能解释是什么?

你在没有声明的情况下调用abs 这意味着编译器不知道任何参数的预期类型。

您将double参数传递给abs (它需要一个int )。 这会调用未定义的行为,这意味着任何事情都可能发生。 在您的情况下确实如此,因为如果添加不相关的printf会得到不同的结果。

您可以通过为abs添加声明来修复未定义的行为。 事实上,如果你#include <stdlib.h>printf的问题就会消失。

但是,这不会使您的程序正确。 正如@cremno 在评论中指出的那样,您应该使用fabs来获取double的绝对值。

因此,修改调用abs的行,如下所示:

    if(fabs(e) <= eps || fabs(w) <=  delta) {

运行修改后的程序打印出来

0
1
2
3
<skipping a few lines>
51
52
Root is 8.603336e-01

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM