2013-02-20 67 views
5

我今天痛苦地得知inf有嚴重的側面問題。你知道嗎?例如sqrtf(NaN)大於慢15倍和sqrtf(-1)是慢30倍(!!)比sqrtf(10.123132) - 這本身就是一個很慢的浮動點計算!?你計算垃圾,需要花費大量的時間,甚至沒有意識到。Catch Nan和Inf在Windows C++

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

你怎麼能做到這一點在Windows下:

好,在Linux下,你可以通過拋出一個異常發生時,他們抓住楠和INF錯誤?

編輯: 標杆代碼:

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

你是如何衡量那個時間的?也許而不是隱藏異常,你應該防止發生? – 2013-02-20 21:49:59

+1

使用'isinf()'和'isnan()'檢查值? http://msdn.microsoft.com/en-us/library/hh308344.aspx – 2013-02-20 21:50:07

+3

使用_controlfp()開啓異常 – 2013-02-20 21:51:17

回答

5

如果你正在使用Visual Studio,您可以打開浮動使用/fp:except選項指向異常。見http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx

代碼中的等效內容爲#pragma float_control(except, on)。見http://msdn.microsoft.com/en-us/library/45ec64h6(v=vs.110).aspx

在運行時,您可以使用類似_controlfp(_MCW_EM, _MCW_EM)的東西。請參閱http://msdn.microsoft.com/en-us/library/vstudio/e9b52ceh(v=vs.110).aspx

+0

我想使用一個基本的編輯器(geany等) - _controlfp聽起來很有前途。任何需要的圖書館鏈接? – Kenobi 2013-02-21 16:43:28

+0

我相信它是crt的一部分。應該很容易去嘗試看看。 – 2013-02-21 17:11:59