gpt4 book ai didi

注释 printf 语句会停止输出

转载 作者:行者123 更新时间:2023-11-30 21:10:00 25 4
gpt4 key购买 nike

我正在尝试编写 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;
}

我得到的输出是:根是 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

关于注释 printf 语句会停止输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32644001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com