実際の浮動小数点演算では、追加シンボルINF(無限大)、NAN、符号付きゼロがあります。複雑な計算の場合、これはより困難です。 1は、乗算、除算無限大と整数倍の複素乗算/除算
(a + ib)(c + id) = (ac - db) + i(ac+bd)
(a + ib)/(c + id) = ((ac + db) + i(ac-bd))/(c*c + d*d)
ための「ナイーブ」のルールを使用している場合1は、ほぼすべての場合、B、Cのいずれかの変数のための(*)間違った結果を取得し、Dは、INFまたはNANです。
例えば
- (1 + I 0)*(INF + I0)はINF + INANを=。実数演算と比較して、* INF = INF
- (0 + i1)*(NAN + i0)= NAN + iNANである。しかしながら、i * NAN =(0 + iNAN)
- 1 /(0 + 0i)= NAN + iNANを期待するだろう。これは、例えばz = 1 /(1/z)のように壊れます。これは実際の算術演算では完全に機能します。
このリストは簡単に続く可能性があります。
問題は、複素除算と乗算を正しく実装して、実数部または虚数部のいずれかがINFとNANである場合を含むすべてのケースが意味のある結果をもたらすようにすることですか?また、INFとNANとの複雑な算術の正しい動作を保証するプログラミング言語もありますか?
EDIT:どのプログラミング言語の標準(バージョン)がINFとNANで正しい複素数計算を必要としているか知りたいです。私が最も関心のある言語は、C、C++、およびFORTRANファミリです。
(*)は、数学的には意味がない、またはIEEE-754の意味で反直感的であるという意味では間違っています。
を参照してください?何語? [Here](http://llvm.org/svn/llvm-project/libcxx/trunk/include/complex)は、clangのC++の ''実装です。 'operator *'実装を見ると、INF/NaNの処理方法を示しています。それに反するものは何ですか? –
彼らは正しいことをしているようです。リンクありがとう。私の質問はどの言語がそれを保証しているか、すなわちどの言語で仕様が正しいINFとNANの動作を要求しているかです。私の知る限り、これはC++の場合ではありません(しかし、私は間違っている可能性があります)。 FORTRANもそれを必要としていないようです。ここで私は明確にしたいと思います。 –
問題は、INFとNANの処理に依存する移植性のあるコードを書いておきたい場合、コンパイラによっては正しく実行され、いくつかのコンパイラでは正しく動作しない場合は無意味です。 –