在Windows C中捕获Nan和Inf

前端之家收集整理的这篇文章主要介绍了在Windows C中捕获Nan和Inf前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我今天痛苦地了解到Nan和Inf有严重的问题.您是否知道例如sqrtf(NaN)比sqrtf(10.123132)慢了15倍以上且sqrtf(-1)慢30倍(!!) – 这是一个非常缓慢的浮点计算!?你计算垃圾,需要荒谬的时间,甚至没有意识到.

好的,在Linux下你可以通过在发生异常时抛出异常来捕获Nan和Inf错误

  1. #include <fenv.h>
  2. feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);

你怎么能在Windows下实现这一目标?

编辑:
基准代码

  1. float a,b;
  2. a = 1.0 / 0; //inf
  3. a = -10; //also nice
  4. long c=0;
  5. long time = SDL_GetTicks();
  6.  
  7. for (long i=1;i<=1000000;i++) {
  8. b=sqrt(a);
  9. }
  10.  
  11. ostringstream Help; Help << SDL_GetTicks()-time;
  12.  
  13. //RESULT SHEET
  14. //sqrt(1): 21ms
  15. //sqrt(10): 21ms
  16. //sqrt(10.123): 20ms
  17. //sqrt(-10); 390ms
  18. //sqrt(+-NaN): 174ms
  19. //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.

猜你在找的Windows相关文章