C/C++ で複素数の操作を実行する次のコードを考えてみましょうfloat
。
float real_part = log(3.f);
float imag_part = 0.f;
float real_part2 = (imag_part)*(imag_part)-(real_part*real_part);
float imag_part2 = (imag_part)*(real_part)+(real_part*imag_part);
結果は次のようになります。
real_part2= -1.20695 imag_part2= 0
angle= 3.14159
ここangle
で、 は複素数の位相で、この場合は ですpi
。
ここで、次のコードを検討してください。
float real_part = log(3.f);
float imag_part = 0.f;
float real_part2 = (-imag_part)*(-imag_part)-(real_part)*(real_part);
float imag_part2 = (-imag_part)*(real_part)+(real_part)*(-imag_part);
結果は次のようになります。
real_part2= -1.20695 imag_part2= 0
angle= -3.14159
結果の虚部は、結果-0
の位相を にします-pi
。
複素数の主要な引数と浮動小数点の の符号付きプロパティを使用して達成できますが0
、この変更は、複素数の関数を定義するときに問題になります。たとえばsqrt
、de Moivre の公式で複素数を定義している場合、結果の虚数部の符号が間違った値に変更されます。
この影響にどう対処するか?