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

标签 c crash nan

有时我得到一个 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 双核处理器 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.
}

最佳答案

您是否有可能在程序的其他地方发生堆栈或内存覆盖 - 错误的线程处理或错误处理的互斥量?添加 sleep 以“修复”问题让我认为这可能是并发问题。如果可能,调试这些值并查看它们是否从其他位置动态更改并写入内存断点或可能只是一些 printfs(这可能会改变问题的时间并将其隐藏。)

关于c - 为什么可以通过重复计算来防止 nan ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14819118/

相关文章:

Python .drop 没有给出我期望的结果

c - 如果数字 <2^63,如何显示数字是否为质数?

android - 是否有开源 Android 应用公开其崩溃报告?

javascript - 获取 NaN 而不是 Number

javascript - 我需要帮助弄清楚为什么我在这个函数中得到 NaN

AngularJS IE9 由于附加组件而崩溃

c - 冒泡排序示例

c++ - 是否可以先编译最近更改的文件?

C内联汇编帮助(digital mars c编译器)

android - 从Playstore下载后,启动时应用崩溃