8

我今天痛苦地得知NanInf有严重的问题。例如,您是否知道 sqrtf(NaN)比 sqrtf(10.123132)慢 15 倍以上,而 sqrtf(-1)比 sqrtf(10.123132)慢 30 倍(!!)——这本身就是一个非常慢的浮点计算!?你计算垃圾,需要荒谬的时间,甚至没有意识到。

好的,在 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
4

1 回答 1

6

/fp:except如果您使用的是 Visual Studio,则可以使用该选项打开浮点异常。请参阅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

于 2013-02-20T23:57:53.043 回答