我试图在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)定义编写自定义函数? 我真的很想知道这里发生了什么,所以我非常感谢你对此有任何彻底的答复。
答案 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)));}