2

cmath での exp() 関数の浮動小数点実装は、非常に高次の切り捨てられたテイラー級数展開と同等ですか? 心に留めておくべきエラーの原因の 1 つは、答えを表すビット数が有限であることです。

4

4 に答える 4

5

cmath での exp() 関数の浮動小数点実装は、非常に高次の切り捨てられたテイラー級数展開と同等ですか?

に相当?はい。これは、 の適切な実装にexp()は、ULP (最小精度の単位) の半分程度の誤差があるためです。有限精度算術の問題を無視して、同じことを行う切り詰められたテイラー級数をいつでも構築できます。

ただし、exp()テイラー展開を使用する適切な実装はありません。それは非常に遅くなり、望ましい精度を達成できません。それは実にばかげた実装になるでしょう。2 xと e xの間に強い関係があるという事実と、浮動小数点数のほぼ普遍的な 2 の累乗表現を考えると、2 xの計算はかなり簡単であるという事実を使用する方がはるかに優れています。

于 2012-09-09T20:26:34.320 に答える
2

exp (x) を計算する方法の例:

x が非常に大きい場合、結果は +inf になります。x が非常に小さい場合、結果は 0 になります。

k = ラウンド (x / ln 2) とします。次に、exp (x) = 2^k * exp (x - k ln 2) です。2^k は簡単に計算できます。小さな問題は、丸め誤差なしで x - k ln 2 を計算することです。これはとても簡単です。L1 = ln 2 を 35 ビットに丸め、L2 = ln 2 - L1 とします。k は小さめの整数なので、k * L1 には丸め誤差はなく、x - k * L1 もありません。次に、k * L2 を引きます。これは小さいため、丸め誤差はほとんどありません。

これをより迅速に (除算なしで) 行うには、k = round (x * (1 / ln 2)) を計算します。そして、x がゼロに近いかどうかをチェックするので、計算全体は必要ありません。とにかく、結果が sqrt (1/2) と sqrt (2) の間にある exp (x) を計算します。

テイラー多項式を使用して exp (x) を計算できます。代わりに、より低い次数でカットオフ エラーを最小化するチェビシェフ多項式を使用することになるでしょう。少し注意すれば、カットオフ エラーが結果の最下位ビットより大幅に小さい多項式を見つけることができます。

于 2014-04-09T20:46:06.663 に答える
1

これは、コンパイラ、C ランタイム、およびプロセッサの実装に依存します。ただし、より優れた方法が存在するため、指数を計算する人はテイラー展開を使用する可能性はほとんどありません。

glibc に従って、コメントでこれを言う独自の実装を使用する場合があります (sysdeps/ieee754/dbl-64/e_exp.c から):

/* An ultimate exp routine. Given an IEEE double machine number x          */
/* it computes the correctly rounded (to nearest) value of e^x             */

または、x86 FPU のように、浮動小数点計算にハードウェアでサポートされているプロセッサ命令を使用する場合もあります。どちらの場合も、完全な精度で正しく丸められた値を取得する可能性があります。

于 2012-09-09T17:35:23.977 に答える
0

これは、使用している C ライブラリの実装によって異なります。非常に人気のある glibc では、そうではありません。

于 2012-09-09T16:54:59.910 に答える