6

javaでexpm1関数を使用することについて混乱しています。Math.expm1のOraclejavadocには次のように書かれています。

exp(x)-1を返します。xの値が0に近い場合、expm1(x)+ 1の正確な合計は、exp(x)よりもexの実際の結果にはるかに近いことに注意してください。

しかし、このページには次のように書かれています。

ただし、xの負の値(約-4以下)の場合、Math.exp()の計算に使用されるアルゴリズムは比較的動作が悪く、丸め誤差が発生します。別のアルゴリズムでex-1を計算してから、最終結果に1を加算する方が正確です。

負のx値または0に近い値には、expm1(x)を使用する必要がありますか?

4

2 に答える 2

10

doubleビット レベルでの の実装は、 1 に近い sdoubleよりもはるかに高い精度で 0 に近い sを格納できることを意味します。に非常に近い正確な数値。doubleexpm1expdouble1

あなたが引用している記事が正しいとは思えませMath.expdouble。このMath.exp仕様では、結果が正確な値の 1 ulp 以内であることを保証しています。つまり、少し単純化すると、相対誤差はせいぜい 2^-52 です。

于 2012-08-17T19:38:19.197 に答える
6

expm1(x)0 に近いものに使用します。正または負。

その理由は、exp(x)0 に近いものは 1 に非常に近くなるためです。したがって、0 に近いexp(x) - 1場合、破壊的なキャンセルが発生xします。

expm1(x)この破壊的なキャンセルを回避するために適切に最適化されています。


数学的な側面から:expがそのテイラー級数を使用して実装されている場合expm1(x)、最初の を単に省略するだけで実行できます+1

于 2012-08-17T19:37:17.367 に答える