为什么同一编译器的不同版本给出不同的结果?

时间:2019-07-26 09:35:26

标签: c++ floating-point stdout

我试图计算 n th 个谐波数。这是我程序的主要代码段:

#include<cstdio>
using namespace std;

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 编辑器,编译器 gcc 5.1 中),一切似乎都很好。

The output on my machine

但是,当我在online editor, it prints zero中运行它时。在这里,编译器为 gcc 8.3

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

1 个答案:

答案 0 :(得分:6)

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

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);