GNU Octave で式 exp(i*pi) が間違った結果を返すのはなぜですか?

GNU Octave で式 exp(i*pi) が間違った結果を返すのはなぜですか?

今日GNU Octaveを学び始め、マニュアルに記載されている最初の式を試してみました。

exp(i*pi)

結果は

ans = -1.0000e+000 + 1.2246e-016i

GNU Scientific Library でも同様の結果が得られるようです。

これは Octave のバグでしょうか、それとも数値解析ソフトウェアの一般的な問題でしょうか (記号評価ソフトウェアは間違いなく正確な答えを出すでしょう)?

答え1

これはどちらのバグでもありませんが、コンピューターが浮動小数点演算を実行する方法によるものです。コンピューターが処理できる精度には限りがあるため、このような異常が時々発生します。これを処理できるソフトウェアを作成することは可能ですが、計算時間が大幅に長くなり、メモリ要件が大幅に増加します。

これを見ると、e^(i*pi) は -1 + 1.2x10^-16i を返します。ご覧のとおり、虚数部は非常に小さいです (実数部より 16 桁小さいため、ほとんどの人は無視できると考えるでしょう)。この成分は、計算自体と、無理数であるために格納されている pi の値の両方で、丸めと精度の誤差によって発生します (このリンク無理数を扱う別の例については、こちらをご覧ください。

この計算誤差が許容できない場合は、数値解析ではなく記号解析を実行する数学パッケージ、または高精度浮動小数点数これらの欠点は、メモリ要件が大幅に増加し、記号解析が遅くなることです。また、精度の高い数値は丸め/精度の誤差の大きさを縮小するだけです。ないそれらを排除します。

関連情報