2013-02-20 65 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