我今天痛苦地得知Nan和Inf有严重的问题。例如,您是否知道 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