1

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

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

>>-0.481211
>>-0.881373
>>nan

我错过了什么吗?这适用于我使用的所有其他类型的 Python。

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

4

1 回答 1

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)));}
于 2016-03-31T11:58:06.073 回答