为什么同一编译器的不同版本会给出不同的结果?
Why different versions of same compiler is giving different outcomes?
我正在尝试计算 nth 谐波数。这是我的程序的主要片段:
#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
但是当我 运行 它在 online editor, it prints zero 里面时。这里,编译器是 gcc 8.3.
我想知道这种现象背后的原因以及避免这种情况的方法,以便获得预期的输出。
您应该打开编译器警告。它对这些事情有很大帮助。如果你这样做,它会显示:
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);
我正在尝试计算 nth 谐波数。这是我的程序的主要片段:
#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
但是当我 运行 它在 online editor, it prints zero 里面时。这里,编译器是 gcc 8.3.
我想知道这种现象背后的原因以及避免这种情况的方法,以便获得预期的输出。
您应该打开编译器警告。它对这些事情有很大帮助。如果你这样做,它会显示:
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);