【问题标题】:Weird floating point exception奇怪的浮点异常
【发布时间】:2015-11-17 00:59:46
【问题描述】:

在下面的代码 sn-p 中,我在运行时遇到了一个浮点异常。我相信异常发生在除以 r 的那一行。当我评论该行时,我没有收到任何错误。

当我在 gcc 中编译时使用“-g”标志(尝试调试)或者如果我在“if 语句”之后立即插入一些“cout 语句”,那么我没有得到任何浮点数,这也非常奇怪运行时异常。

我已经盯着这段代码的屏幕看了好几个小时了,也许我犯了一些愚蠢的错误..请帮忙!

    double prev;
    for(int i=0;i<320;i++)
    for(int j=0;j<320;j++) 
    {
        double x = -8 + i*0.05;
        double y = -8 + j*0.05;
        r= sqrt(x*x+y*y);

        double kappa = atanh(  (2*r)  / ( 2 +  r*r)  );                     

        if( fabs(r) > 1e-7 )
        { 
            prev= ( x*sinh(kappa) )/r; 
        }
         else
        {
            prev=0;         

        }
        /* more stuff */ 
    }

更新: 所以我能够通过在有争议的行上将 1e-15 添加到分母来解决问题..

prev= ( x*sinh(kappa) )/(r+1e-15);

我仍然不确定为什么 if 条件为 true .. for if(fabs(r)>1e-7) when r =0;

【问题讨论】:

  • 会不会是溢出异常?我的意思是,sinh 确实增长为 O(e^x)
  • 感谢您的评论。我用简单的 prev = 1/r ... 替换了该行,但仍然是同样的错误。

标签: exception sigfpe


【解决方案1】:

负数的平方?试试

r= sqrt(fabs(x*x+y*y)); 

在您的 sn-p 的第 7 行。

【讨论】:

  • xx+yy 保证为零或正数
  • negative 乘以 negative 是正数。 positive 乘以 positivepositive。任何数字乘以自身将是positive。那么什么数字乘以自身会产生negative
  • @kpie 很有趣! speleotrove.com/decimal/daops.html#refsqrt 然而,此链接澄清了有符号零的 sqrt 只是有符号零,不应触发 SIGFPE
  • 这是真的。但实际上,如果使用计数切割 else 语句可以解决错误,则问题可能是 prev = 0... /** more stuff **/
猜你喜欢
  • 1970-01-01
  • 2020-07-27
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多