2012-10-09 12 views
8

.NETのSystem.Numerics.Complexデータ型が数学的に正確な結果をもたらさないことがわかりました。代わりの.NETの複合型が壊れているのはなぜですか?

Complex.Sqrt(-1) != Complex.ImaginaryOne 

は(0、1)、私が得る(6.12303176911189E-17は、1)、丸め誤差によく似ていますいます。

浮動小数点演算ではこのような結果になることがありますが、通常は整数を使用すると丸め誤差が発生しません。

なぜこの基本的な操作は明らかに間違った結果になりますか?

+3

種類が壊れていない、劇的な理由はありません。 –

+3

@HenkHoltermanそれは、それを説明するのに最適な言葉です。 –

+0

[.NETでの倍精度問題](http://stackoverflow.com/q/566958/60761)や他の多くの可能性のある重複があります。 –

答えて

10

逆コンパイルSqrtメソッドを見てください。

public static Complex Sqrt(Complex value) 
{ 
    return Complex.FromPolarCoordinates(Math.Sqrt(value.Magnitude), value.Phase/2.0); 
} 

実際には、極座標とラジアンを使用することによって丸め誤差が発生します。 value.Phase/2.0はpi/2を返します。これは正確に表現可能な数ではありません。極座標(1、π/ 2)から変換するとき、実座標がゼロに近づくと丸め誤差が見えるようになります。

関連する問題