gpt4 book ai didi

c++ - 在 Windows C++ 中捕获 Nan 和 Inf

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:53 29 4
gpt4 key购买 nike

我今天痛苦地得知 NanInf 有严重的副作用。例如,您是否知道 sqrtf(NaN) 比 sqrtf(10.123132) 慢 15 倍 并且 sqrtf(-1) 慢 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

最佳答案

如果您使用的是 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 .

关于c++ - 在 Windows C++ 中捕获 Nan 和 Inf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990565/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com