« #Calc 1.1.4 その 11 | トップページ | #Script 精度の扱い »

2006年9月12日 (火)

プログラムにおける複素数の扱い

Fortranや、現在C/C++コンパイラと共に配布されているライブラリに必要な SQRTやLOGといった複素関数の実装をみると、 途方に暮れることになります。 IEEE 754 で規定された 0.0 の符号を無視した結果、負の実数値を持つ複素数Zに関して SQRT( CONJ( Z ) ) = CONJ( SQRT( Z ) ) や LOG( CONJ( Z ) ) = CONJ( LOG( Z ) ) といった等式が成立しなくなっているのです。この異常現象は、複素数演算が 実数と虚数変数の和 x + i*y ではなくペア(x, y)に対して行われる限り、 避けられません。 ペアを使った言語は複素数演算に関して不正確です。 虚数型が必要なのです。

z が負の実数であるならば、sqrt(conj(z)) = conj(sqrt(z)) や log(conj(z)) = conj(log(z)) はもともと成り立たなくて当然だと思うが……。どこら辺が 0.0 の符号を無視した結果のせいなんだ?

というか、複素数を数式的な和で表すかペアで表すかに実質的な違いはない。どちらにしても一つの複素数が二つの実数によって表されているという実質は変わらない。ペアが不正確なら和でも不正確だ。しかも何でそこで純虚数型を導入すれば問題が解決するというんだ?

式 (1 - infinity*i) * i を考えると、この結果は (infinity + i) となるべきです。しかし、もし第二オペランドが 単なる i でなく (0 + i) だったとすると、結果は (infinity + NaN*i) となり、誤ったNaNが作られます。

そもそも実部が無限で虚部が有限であるという奇妙な値を扱うことに意味があるのか。Mathematica でも (1 - Infinity * I) * I は単に Infinity になる。というか、複素数の乗算の定義に忠実に計算すれば、途中で ∞×0 が出てくるのだから、NaN になって当たり前だろう。あるいは、infinity + i を極形式で表すとすればどうするんだ?

虚数型を区別することで、分枝切断を持つ計算に必要な 0 の符号は保持されます。

これはまだ意味がよく分からん。複素数型では 0 の符号を保持できず、純虚数型では保持できるとはたとえばどういう状況だ? それに分岐切断があると 0 の符号を保持する必要があるというのも分からん。

|

« #Calc 1.1.4 その 11 | トップページ | #Script 精度の扱い »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/169172/11868745

この記事へのトラックバック一覧です: プログラムにおける複素数の扱い:

« #Calc 1.1.4 その 11 | トップページ | #Script 精度の扱い »