加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

在Windows C中捕获Nan和Inf

发布时间:2020-12-14 01:50:32 所属栏目:Windows 来源:网络整理
导读:我今天痛苦地了解到Nan和Inf有严重的问题.您是否知道例如sqrtf(NaN)比sqrtf(10.123132)慢了15倍以上且sqrtf(-1)慢30倍(!!) – 这是一个非常缓慢的浮点计算!?你计算垃圾,需要荒谬的时间,甚至没有意识到. 好的,在Linux下你可以通过在发生异常时抛出异常来捕
我今天痛苦地了解到Nan和Inf有严重的问题.您是否知道例如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(除了,打开).见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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读