首页 > 解决方案 > 为什么同一编译器的不同版本会给出不同的结果?

问题描述

我试图计算n谐波数。这是我的程序的主要片段:

#include<cstdio>

int main(){
    int T; scanf("%d", &T);

    for (int C = 1; C <= T; C++){
        int n; scanf("%d", &n);
        long double H = 1;

        for (int i = 2; i <= n; i++)
            H += (1.0/i);

        printf("%.8lf\n", H);
    }

    return 0;
}

当我在我的机器上运行这个程序时(在Code::Blocks IDE,编译器gcc 5.1内),一切似乎都很好。

输入:

10
1
2
3
4
5
6
7
8
9
10

输出:

1.000000
1.500000
1.833333
2.083333
2.283333
2.450000
2.592857
2.717857
2.828968
2.928968

但是当我在在线编辑器中运行它时,它会打印零。这里,编译器是gcc 8.3

我想知道这种现象背后的原因以及避免这种情况的方法,以便获得预期的输出。

标签: c++floating-pointstdoutcodeblocks

解决方案


您应该打开编译器警告。它对这些事情有很大帮助。如果你会这样做,它会显示:

warning: format '%lf' expects argument of type 'double', but argument 3 has type 'long double' [-Wformat=]
   15 |         printf("Case %d: %lf\n", C, H);
      |                          ~~^        ~
      |                            |        |
      |                            double   long double
      |                          %Lf

所以这应该在两个版本中给你类似的结果:

int n; scanf("%d", &n);
long double H = 1;

for (int i = 2; i <= n; i++)
    H += (1.0/i);

printf("%.8Lf\n", H);

推荐阅读