我正在尝试编写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
这种行为有什么可能的解释?
答案 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