反双曲线窦在Ironpython2.7中返回nan

时间:2016-03-31 00:39:44

标签: ironpython hyperbolic-function

我试图在Ironpython 2.7中使用数学模块中的asinh函数。任何时候我都有一个浮动< -1,结果我得到了nan。我知道在cmath中,由于可能使用复数,它们是一些分支削减,但在这里我使用reals并且文档解释了数学是适当的模块。

asinh(-.5)
asinh(-1.)
asinh(-1.001)

>>-0.481211
>>-0.881373
>>nan

我错过了什么吗? 这与我使用的所有其他Python版本一起工作正常。

是否有必要使用log(x + sqrt(x ** 2 + 1)定义编写自定义函数? 我真的很想知道这里发生了什么,所以我非常感谢你对此有任何彻底的答复。

1 个答案:

答案 0 :(得分:1)

查看来源,我发现这个非常松散的实现:

if (Math.Abs(v0) > 1.0) { 
    return Math.Log(v0) + Math.Log(1.0 + MathUtils.Hypot(1.0, 1.0 / v0));}

这就是为什么!如果v0< -1,然后Abs(v0)> 1但Math.Log(v0)未定义... 我在GitHub上向IronPython团队提交了该问题,并建议使用Math.Sign解决问题:

 if (Math.Abs(v0) > 1.0) { 
     return Math.Sign(v0)*(Math.Log(Math.Abs(v0)) + 
               Math.Log(1.0 + MathUtils.Hypot(1.0, 1.0 / v0)));}