注释printf语句会停止输出

时间:2015-09-18 04:41:13

标签: c function printf

我正在尝试编写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是7.853982e-01 如果我评论该文件,我没有输出。

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

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

1 个答案:

答案 0 :(得分:0)

您在没有声明的情况下致电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