1

Ironpython 2.7 の math モジュールから 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 に答える