gpt4 book ai didi

c - 没有注释掉未使用的语句时出现浮点异常?

转载 作者:太空狗 更新时间:2023-10-29 17:03:02 24 4
gpt4 key购买 nike

当运行如下所示的程序时,它会产生 ok 输出:

 j=         0    9007199616606190.000000 = x
k= 0 9007199616606190.000000 = [x]
r= 31443101 0.000000 = m*(x-[x])

但是当注释掉的行( //if (argc>1) r = atol(argv[1]);)被取消注释时,它产生:

 j=     20000    9007199616606190.000000 = x
k= 17285 9007199616606190.000000 = [x]
r= 31443101 0.000000 = m*(x-[x])

即使该行应该没有效果,因为 argc>1 是错误的。有人对这个问题有合理的解释吗?它可以在任何其他系统上重现吗?

 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[]) {
int j, k, m=10000;
double r=31443101, jroot=sqrt(83), x;
//if (argc>1) r = atol(argv[1]);
x = r * r * jroot;
j = m*(x-floor(x));
k = floor(m*(x-floor(x)));
printf ("j= %9d %24.6f = x\n", j, x);
printf ("k= %9d %24.6f = [x]\n", k, floor(x));
printf ("r= %9.0f %24.6f = m*(x-[x]) \n", r, m*(x-floor(x)));
return 0;
}

注意,测试系统 = AMD Athlon 64 5200+ 系统和 Linux 2.6.35.14-96.fc14.i686(,启动以在 64 位硬件上运行 32 位操作系统)海合会 (GCC) 4.5.1 20100924 (红帽 4.5.1-4)

更新 -- 几个小时前,我发表了一条评论,指出使用和不使用 if 语句生成的代码仅在堆栈偏移量和一些跳过的代码方面有所不同。我现在发现评论并不完全正确; 对于未优化的代码是正确的,但对于我执行的 -O3 代码不是这样。

优化开关对问题的影响:

  • -O0 : 两个程序版本都运行正常
  • -O2 or -O3 : 带注释的版本有上面的错误,其中j=20000 and k=17285
  • -O1 :带注释的版本有 j=20000(错误)和 k=0(正常)

无论如何,查看 -O3 -S 代码 list ,这两种情况的主要区别在于跳过的 if 代码和堆栈偏移量直到 call floor 之前的行,在该行指出 with-if 代码比 without-if 代码多了一个 fstpl:

    ...  ;; code without comment:
fmul %st, %st(1)
fxch %st(1)
fstpl (%esp)
fxch %st(1)
fstpl 48(%esp)
fstpl 32(%esp)
call floor
movl $.LC2, (%esp)
fnstcw 86(%esp)
movzwl 86(%esp), %eax
...
... ;; versus code with comment:
fmul %st, %st(1)
fxch %st(1)
fstpl (%esp)
fxch %st(1)
fstpl 48(%esp)
fstpl 32(%esp)
fstpl 64(%esp)
call floor
movl $.LC3, (%esp)
fnstcw 102(%esp)
movzwl 102(%esp), %eax
...

我还没弄清楚造成差异的原因。

最佳答案

在我的系统上没有重复,Win7 运行带有 gcc 4.3.4 的 CygWin。无论有没有 if 语句,j 的值都设置为零,而不是 20K。

我唯一的建议是使用 gcc -S 来查看汇编器输出。这应该有望告诉您出了什么问题。

具体来说,将汇编器输出生成到两个单独的文件,一个用于工作变体,一个用于非工作变体,然后对它们进行 vgrep(并排观察)以尝试确定差异。


顺便说一句,这是您的环境中的严重故障。 m 为 10000,这意味着 x - floor(x) 必须等于 2。我想不出任何实数会是这样:-)

关于c - 没有注释掉未使用的语句时出现浮点异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8251569/

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