8

System.Numerics.Complex.NET のデータ型では数学的に正確な結果が得られないことに驚きました。

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

(0, 1) の代わりに (6.12303176911189E-17, 1) が得られますが、これは丸め誤差のように見えます。

浮動小数点演算は時々このような結果になることがわかりましたが、通常は整数を使用すると丸め誤差を回避できます。

この一見基本的な操作が明らかに間違った結果をもたらすのはなぜですか?

4

1 に答える 1

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, pi/2) から変換する場合、実座標がゼロに近づくと、丸め誤差が表示されます。

于 2012-10-09T19:16:57.983 に答える