反双曲正弦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)));}
我正在尝试使用 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)));}