有时候,由于乘法no-nan b和c:
,我得到了一个nandouble a = b * c; //b = 0, c = 1024, a = nan
或作为floor()的结果:
double a = floor(b); //b = 2024, a = nan
重复计算和使用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
CPU 是AMD Athlon(tm)64 X2双核处理器3400 +
CPU temp :
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)
这个问题可能是CPU计时功能的结果吗?或者问题的另一个原因是什么?
更新
我发现下面的程序在那台机器上产生了nan:
double a, b, c;
while(1) {
a = 0;
b = 1024;
c = a * b; //c will be nan within 10-20 sec.
}
答案 0 :(得分:5)
你是否有机会在程序的其他地方发生堆栈或内存覆盖 - 糟糕的线程处理或处理不当的互斥锁?添加睡眠来“修复”问题让我觉得它可能是一个并发问题。如果可能的话,调试这些值并查看它们是否会从其他位置动态更改并写入内存断点或者可能只是一些printfs(这可能会改变问题的时间并隐藏它。)
答案 1 :(得分: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;
}