2013-02-20 11 views
5

Bardzo boleśnie nauczyłem się, że Nan i Inf mają poważne problemy boczne. Czy wiesz na przykład, że sqrtf (NaN) jest więcej niż 15 razy wolniejszy i sqrtf (-1) jest 30 razy wolniejszy (!!) niż sqrtf (10.123132) - który jest dość powolny, pływający obliczenia punktowe !? Obliczasz śmieci, potrzebujesz do tego śmiesznego czasu i nawet nie zdajesz sobie z tego sprawy.Catch Nan i Inf w systemie Windows C++

Ok, pod Linuksem można złapać Nan i INF błędy rzucając wyjątek, kiedy występują one:

#include <fenv.h> 
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); 

Jak można osiągnąć pod Windows?

EDIT: kod Benchmarking:

float a,b; 
a = 1.0/0; //inf 
a = -10;   //also nice 
long c=0; 
long time = SDL_GetTicks(); 

for (long i=1;i<=1000000;i++) { 
    b=sqrt(a); 
} 

ostringstream Help; Help << SDL_GetTicks()-time; 

//RESULT SHEET 
//sqrt(1): 21ms 
//sqrt(10): 21ms 
//sqrt(10.123): 20ms 
//sqrt(-10); 390ms 
//sqrt(+-NaN): 174ms 
//sqrt(inf): 174 
+1

Jak zmierzysz ten czas? Może zamiast ukrywać wyjątek, należy po prostu zapobiec występowaniu? –

+1

Użyj 'isinf()' i 'isnan()', aby sprawdzić wartość? http://msdn.microsoft.com/en-us/library/hh308344.aspx –

+3

Włączasz wyjątki za pomocą _controlfp() –

Odpowiedz

5

Jeśli używasz Visual Studio, można włączyć floating point wyjątków przy użyciu opcji /fp:except. Zobacz http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx.

Równowartość w kodzie to #pragma float_control(except, on). Zobacz http://msdn.microsoft.com/en-us/library/45ec64h6(v=vs.110).aspx.

W czasie wykonywania możesz użyć czegoś takiego jak _controlfp(_MCW_EM, _MCW_EM). Zobacz http://msdn.microsoft.com/en-us/library/vstudio/e9b52ceh(v=vs.110).aspx.

+0

Chciałbym użyć podstawowego edytora (geany itp.) - _controlfp brzmi obiecująco. Jakieś potrzebne linki do biblioteki? – Kenobi

+0

Wierzę, że to część gry. Powinien być łatwy do wypróbowania i zobaczenia. –

Powiązane problemy