【发布时间】:2013-01-26 23:11:50
【问题描述】:
有时我得到一个 nan 作为乘法 no-nan b 和 c 的结果:
double 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 Dual Core Processor 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)
这个问题可能是 CPU 计时功能的结果吗?还是有其他问题的原因?
更新
我发现以下程序在那台机器上产生了 nan:
double a, b, c;
while(1) {
a = 0;
b = 1024;
c = a * b; //c will be nan within 10-20 sec.
}
【问题讨论】:
-
现在这确实很奇怪。
-
这绝对是机器特有的问题。你超频了吗?它的运行温度是多少?
-
NAN 表示“不是数字”,它是非法浮点运算返回的结果。引用的都不符合条件。
-
我发现您不太可能从简单的乘法中得到 NaN,除非其中一个数字是:1) NaN,或 2) 相乘结果超出范围 (1E+/ -308 左右)。您的输入数据不正确,处理器运行超出规格[超频,冷却不足,内存损坏等]。
-
@MatsPetersson 即使这样:浮点运算的现代实现不应该将溢出作为 Inf 处理吗?