[英]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.