【问题标题】:commenting a printf statement stops output注释 printf 语句会停止输出
【发布时间】:2015-12-15 03:06:53
【问题描述】:

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

#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

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

【问题讨论】:

  • 您的代表建议您已经存在了足够长的时间,因此知道最好不要将代码仅留在粘贴站点中。将其设为 MCVE (How to create a Minimal, Complete, and Verifiable Example?) 并将代码包含在问题中。
  • abs()double?使用fabs()(更重要的是启用警告)。
  • 对于 if(abs(e) &lt;= eps || abs(w) &lt;= delta) { 行,尝试添加代码以输出所有这些变量,并比较两次运行之间的变化
  • @Ari0nhh 当“在 MSVC 中正常工作”时,C 编译是 C++ 编译的吗?
  • @chux 两者都有,尽管 C++ 得到的结果与 C 略有不同。C 编译器还会在 abs 函数上生成 double to int 截断警告,这很可能是问题根源。

标签: c function printf


【解决方案1】:

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

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

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

不过,这不会使您的程序正确。正如 cmets 中的@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2019-11-13
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多