我今天痛苦地得知南和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
你是如何衡量那个时间的?也许而不是隐藏异常,你应该防止发生? – 2013-02-20 21:49:59
使用'isinf()'和'isnan()'检查值? http://msdn.microsoft.com/en-us/library/hh308344.aspx – 2013-02-20 21:50:07
使用_controlfp()开启异常 – 2013-02-20 21:51:17