8

no-nan b と c を乗算した結果、nan が得られることがあります。

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.
}
4

2 に答える 2

5

プログラムの他の場所からスタックまたはメモリの上書きが発生する可能性はありますか?スレッド処理またはミューテックスの処理が不適切ですか? 問題を「修正」するためにスリープを追加すると、同時実行の問題である可能性があると思います。可能であれば、値をデバッグし、メモリ ブレーク ポイントへの書き込みまたはおそらく一部の printfs (問題のタイミングを変更し、それを非表示にする可能性がある) を使用して、他の場所からオンザフライで値が変更されるかどうかを確認します。

于 2013-02-11T19:12:33.193 に答える
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;
}
于 2013-02-16T20:03:05.163 に答える