%20%E3%81%8C%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E7%B5%90%E6%9E%9C%E3%82%92%E8%BF%94%E3%81%99%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
今日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 の値の両方で、丸めと精度の誤差によって発生します (このリンク無理数を扱う別の例については、こちらをご覧ください。
この計算誤差が許容できない場合は、数値解析ではなく記号解析を実行する数学パッケージ、または高精度浮動小数点数これらの欠点は、メモリ要件が大幅に増加し、記号解析が遅くなることです。また、精度の高い数値は丸め/精度の誤差の大きさを縮小するだけです。ないそれらを排除します。