我今天痛苦地了解到, Nan 和 Inf 存在严重的问题。您是否知道例如sqrtf(NaN)比慢15倍而sqrtf(-1)慢30倍(!!)比sqrtf(10.123132) - 这是一个非常缓慢的浮点计算!?你计算垃圾,需要荒谬的时间,甚至没有意识到。
好的,在Linux下你可以通过抛出异常来捕获Nan和Inf的错误:
#include <fenv.h>
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
你怎么能在Windows下实现呢?
编辑: 基准代码:
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
答案 0 :(得分:6)
如果您使用的是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。