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
Jak zmierzysz ten czas? Może zamiast ukrywać wyjątek, należy po prostu zapobiec występowaniu? –
Użyj 'isinf()' i 'isnan()', aby sprawdzić wartość? http://msdn.microsoft.com/en-us/library/hh308344.aspx –
Włączasz wyjątki za pomocą _controlfp() –