2016-09-04 29 views
2

実際の浮動小数点演算では、追加シンボル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の意味で反直感的であるという意味では間違っています。

+1

を参照してください?何語? [Here](http://llvm.org/svn/llvm-project/libcxx/trunk/include/complex)は、clangのC++の ''実装です。 'operator *'実装を見ると、INF/NaNの処理方法を示しています。それに反するものは何ですか? –

+0

彼らは正しいことをしているようです。リンクありがとう。私の質問はどの言語がそれを保証しているか、すなわちどの言語で仕様が正しいINFとNANの動作を要求しているかです。私の知る限り、これはC++の場合ではありません(しかし、私は間違っている可能性があります)。 FORTRANもそれを必要としていないようです。ここで私は明確にしたいと思います。 –

+0

問題は、INFとNANの処理に依存する移植性のあるコードを書いておきたい場合、コンパイラによっては正しく実行され、いくつかのコンパイラでは正しく動作しない場合は無意味です。 –

答えて

3

Cの場合は、C99またはC11のAnnex Gを参照してください。少なくともGCCはこれに続き、clangがそうしなかったなら私は驚くだろう。

C++、IIRCの場合、C++標準ではC99/C11 Annex Gを組み込みません。複雑なマルチ/ divのアルゴリズムはインプリメンテーションまでです。

Fortran標準では、複素数の乗算または除算の実装方法を指定していません。除算のために、GFortranは、-fast-mathが指定されている場合を除いて、共通のSmith(1962)メソッドを使用し、その後、単純なアルゴリズムが使用されます。複素除算を計算するための異なるアルゴリズムの比較のために

は、どのような文脈ではhttp://arxiv.org/abs/1210.4539

+1

Claude-Pierre Jeannerod、Nicolas Louvet、Jean-Michel Muller、「FMAによる複雑な浮動小数点除算のコンポーネント精度」についても興味があります。第21回コンピュータ算術に関するIEEEシンポジウム(ARITH 21)*、2013年4月7日、第83-90頁([online](http://www.acsel-lab.com/arithmetic/arith21/papers/) p23。pdf))、さらに:Douglas M. Priest、 "複雑な分割の効率的なスケーリング" * ACMトランザクション数学ソフトウェア(TOMS)* 30.4(2004):389-401。 ([online、paywall](http://dl.acm.org/citation.cfm?id=1039814) – njuffa

+0

ありがとう、これは私が探していたものです。だからCは科学計算の言語です! Annex Gはオプションですが、少なくとも複雑な算術演算が適切に指定されています。 C++とFortranは実際には失望しています... –