2013-02-11 15 views
8

Czasami mam nan wyniku mnożenia no-nan bic:dlaczego nan można zapobiegać przez powielone obliczenia?

double a = b * c; //b = 0, c = 1024, a = nan 

lub wskutek piętrze():

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

duplikaty obliczania i wykorzystania snu() zapobiec występowaniu tego problemu:

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 jest AMD Athlon (tm) 64 X2 dual Core Processor 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) 

Może to kwestia być wynikiem funkcji taktowania CPU? A może istnieją inne przyczyny tego problemu?

UPDATE

dowiedziałem się następujący program produktów nan na tym komputerze:

double a, b, c; 
while(1) { 
    a = 0; 
    b = 1024; 
    c = a * b; //c will be nan within 10-20 sec. 
} 
+2

To naprawdę dziwne. –

+1

To zdecydowanie wydaje się być problemem specyficznym dla komputera. Czy to podkręcasz? W jakiej temperaturze działa? – Kaslai

+0

NAN oznacza "nie numer", to jest to, co bezprawne operacje zmiennoprzecinkowe powracają. Żaden z cytowanych nie kwalifikuje się. – vonbrand

Odpowiedz

1

Właściwie , jest to problem specyficzny dla sprzętu. Następujący program na bieżącej platformie działa 10-20 sekund:

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

BTW: czy "#include "? Mój gcc generuje kod inline bez math.h, a połączenie z __isnan z wildplasser

+0

@wildplasser, yes, math.h powinno być dołączone. Edytuj mój wpis. – Alex

5

jakaś szansa, masz stos lub pamięć nadpisać występujące z innego programu - złego obchodzenia gwintu lub źle obsługiwany muteks? Dodanie snu do "naprawienia" problemu sprawia, że ​​myślę, że może to być problem z współbieżnością. Jeśli to możliwe, debuguj wartości i sprawdź, czy zmieniają się w locie z innych lokalizacji z punktem zapisu do pamięci, czy może tylko niektórymi printfs (które mogą zmienić czas wystąpienia problemu i ukryć go również).

+0

Najszybszym sposobem (dis) udowodnienia tego jest po prostu próba scenariusza w izolacji. Jeśli nadal masz takie same problemy, gdy cały program jest Twoim przykładem, masz kłopoty. – Kaslai

+0

Zgoda - wtedy może być bardziej egzotycznie.Nadal zaczynaj proste ... –

+0

@MichaelDorgan Code został sprawdzony przez valgring. Nic nie znalazłem. Te zmienne są lokalne. – Alex

Powiązane problemy