我今天痛苦地了解到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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。