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


8

今日私はGNU Octaveを学び始め、マニュアルで与えられた最初の表現を試しました

exp(i*pi)

結果は

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

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

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


2
オクターブは主に数値分析を目的としているようです。Mathematicaは間違いなくあなたにより良い答えを与えるでしょう...:P冗談です... GNUシンボリック分析ソリューションを検索してみてください
gd1

@ジャコモ:私はそれを知っています。すべての数値解析ソフトウェアがそのような数に評価されるのか、それともGNU Octaveだけなのかと思うだけです。
Siyuan Ren、2007

@Karsus Renこれは実際にはソフトウェアのバグではなく、ハードウェアのバグです。これは、単一の数値に対してストレージの容量が制限されているハードウェアで、無理な数値を含む式を評価しようとする場合の固有の制限です。
画期的な

回答:


8

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

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

この計算エラーが許容できない場合は、数値分析ではなく記号分析を実行する数学パッケージ、または高精度の浮動小数点数を使用する数学パッケージを調べる必要があります。これらの注意点は、メモリ要件が大幅に増加することであり、シンボリック分析はしばしば非常に遅くなります。また、より高い精度の数値は、丸め/精度エラーの大きさを縮小するだけで、それらを排除することはありません


1
これが数値解析ソフトウェアの一般的な動作であることの確認が必要です。
Siyuan Ren、2011

@Karsus Ren実際には、この種のソフトウェアの動作であり、十分に高い精度を備えています。直感に反するように思えますが、精度の低い数値では、これらの異常が頻繁に返されることはありません。詳細については、Microsoftのこの記事を参照してください。ただし、この問題は、ソースコードとコンパイラ/ターゲットアーキテクチャの両方の組み合わせであることに注意してください。また、このWikipediaの記事には、問題に関するいくつかの背景情報が含まれています。
画期的な

1
根本的な問題は、Octaveの定数piが数学的な定数πではなく、それに近い浮動小数点近似であることです。このexp関数は、さらに小さなエラーを追加します。シンボリック式で機能するシステムはexp(i*pi)正確に計算できます。オクターブはそのようなシステムではありません。
キーストンプソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.