有限精度(データ型はdouble)でexp関数の誤差を計算したい。テイラー級数または他の特別なアルゴリズムですか?
2 に答える
一般に、e xを実装する最良の方法はexp
、コンピューティングプラットフォームが提供する関数を呼び出すことです。
これに失敗すると、exp
機能の実装は複雑になり、いくつかの難解なスキルが必要になります。通常、実装には次のものが含まれます。
- NaNなどのさまざまな特殊なケースの入力をテストします。
- 入力にlog2eの特別に準備された表現を掛けて、問題をexから2yに変換します。ここで、y = x • log2eです。
- yの整数部分を浮動小数点エンコーディングの指数フィールドに移動します。
- ミニマックス多項式を使用してyの小数部分の指数を評価します。
- 上記の2つの結果を組み合わせる。
さらに:
- ミニマックス多項式は、多くの場合、特別なソフトウェアを使用して、Remezアルゴリズムまたは同様のものを使用して設計されています。
- 最終結果を正確に計算できるように、作業はある程度の精度で実行する必要があります。
テイラー級数は、中心点から離れると不正確になるため、関数の評価には不適切です。これは、必要な精度に収束するには用語が多すぎることを意味します。項が多すぎると時間がかかるだけでなく、正確な計算が難しくなります。
エリックが彼の回答で言ったことの多くに同意しますが、追加する価値のあるいくつかのポイントがあります。とりわけ、指数関数から高精度(ユーザー指定)の評価を可能にするツールを作成しました。
精度が変化する可能性がある場合は、単一の多項式近似では不十分であるため、直列近似などのツールを使用する必要があります。それでも、採用できるトリックはたくさんあります。実際、私はそのようなシリーズを加速するために使用したさまざまなトリックに驚いていました。
そのような努力のための良いスターターリファレンスは、ハートによる「Computer Explicitimations」、悲しいことに見つけるのが簡単ではない本です。多くの多項式近似を提供しますが、範囲縮小のトリックについても適度に詳細に説明します。
指数級数自体は特に興味深いものです。HPFに含まれているファイルHPFMod2.pdfのセクション4.1で、指数関数に使用した方法について説明します。
例として、exp(123.456789)を計算するには、系列を直接使用しようとする場合がありますが、e自体の値を格納することをお勧めします。次に、範囲縮小を使用して計算できます
exp(123.456789) = exp(1)*exp(2)*exp(8)*exp(16)*exp(32)*exp(64)*exp(.456789)
二乗を繰り返すことで2の累乗の指数が得られ、小数部分は適度に急速に収束します。(たとえば、最終シリーズの100桁の精度には、31の用語が必要です。)
しかし、たまたまそれに気づいたとしましょう
123.456789 = 28*ln(10) + 58.9844063961667
これで、目的の指数を次のように書くことができます。
exp(123.456789) = 10^28 * exp(1)*exp(2)*exp(8)*exp(16)*exp(32)*exp(-0.0155936038332811)
ln(10)の値がわかっている(保存されている)限り、最終的なシリーズでは、必要な100桁の精度を達成するために約17項しか必要としません。