2012-10-09 24 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,pi/2)轉換時,當真實座標接近零時,舍入誤差變爲可見。