反双曲正弦returns man in Iron Python2.7

Inverse hyperbolic sinus returns nan in Ironpython2.7

我正在尝试使用 Ironpython 2.7 中数学模块中的 asinh 函数。每当我有一个 float < -1 时,我都会得到 nan。我知道在 cmath 中,由于可能使用复数,它们是一些分支削减,但在这里我使用实数,文档解释说 math 是合适的模块。

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

>>-0.481211
>>-0.881373
>>nan

我是不是漏掉了什么? 这适用于我使用的所有其他 Python 风格。

是否需要使用 log(x+sqrt(x**2+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)));}