为什么通过重复计算可以防止nan?

Ale*_*lex 8 c crash nan

有时候,由于乘法no-nan b和c,我得到了一个nan:

double a = b * c; //b = 0, c = 1024, a = nan
Run Code Online (Sandbox Code Playgroud)

或者作为floor()的结果:

double a = floor(b); //b = 2024, a = nan
Run Code Online (Sandbox Code Playgroud)

重复计算和使用sleep()可以防止出现此问题:

a = b * c;  //a = nan
a = b * c;  //a = 0

a = floor(b);  //a = nan
a = floor(b);  //a = 2024

sleep(1);
a = b * c;  //a = 0

sleep(1);
a = floor(b);  //a = 2024
Run Code Online (Sandbox Code Playgroud)

CPU是AMD Athlon(tm)64 X2双核处理器3400+

CPU温度:

k8temp-pci-00c3
Adapter: PCI adapter
Core0 Temp: -1?°C
Core0 Temp: -2?°C
Core1 Temp: +3?°C
Core1 Temp: +7?°C

Adapter: SMBus PIIX4 adapter at 0b00
M/B Temp:    +30?°C  (low  =    +0?°C, high =   +85?°C)   
CPU Temp:  +28.5?°C  (low  =  +0.0?°C, high = +85.0?°C)   
M/B Crit:    +85?°C  (hyst =   +75?°C)                  
CPU Crit:   +124?°C  (hyst =  +114?°C)   
Run Code Online (Sandbox Code Playgroud)

这个问题可能是CPU计时功能的结果吗?或者问题的另一个原因是什么?

UPDATE

我发现下面的程序在那台机器上产生了nan:

double a, b, c;
while(1) {
   a = 0;
   b = 1024;
   c = a * b; //c will be nan within 10-20 sec.
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*gan 5

你有没有机会从程序中的其他地方发生堆栈或内存覆盖 - 糟糕的线程处理或处理不当的互斥锁?添加睡眠来"修复"问题让我觉得它可能是一个并发问题.如果可能的话,调试这些值并查看它们是否会从其他位置动态更改并写入内存断点或者可能只是某些printfs(这可能会改变问题的时间并将其隐藏起来.)


Ale*_*lex 1

实际上,这是硬件特定问题。以下程序在当前平台上运行 10-20 秒:

#include <math.h>
int main() {
   double a, b, c;
   while (1) {
      a = 0;
      b = 1024;
      c = a * b;
      if (isnan(c)) break;
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)