2012-10-09 16 views
8

Byłem zdumiony stwierdzeniem, że typ danych System.Numerics.Complex w .NET nie daje matematycznie dokładnych wyników.Dlaczego typ złożony .NET jest uszkodzony?

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

Zamiast (0, 1), otrzymuję (6.12303176911189E-17, 1), który wygląda trochę jak zaokrąglenia błędu.

Teraz zdaję sobie sprawę, że arytmetyka zmiennoprzecinkowa czasami prowadzi do takich wyników, ale zwykle użycie liczb całkowitych pozwoli uniknąć błędów zaokrąglania.

Dlaczego ta pozornie podstawowa operacja daje oczywiście zły wynik?

+3

Typ nie jest zepsuty, nie ma powodu do dramatyczności. –

+3

@HenkHolterman Cóż, to najlepsze słowo, jakie udało mi się opisać. –

+0

Możliwy duplikat [Problemy z podwójną precyzją w .NET] (http://stackoverflow.com/q/566958/60761) i wiele innych. –

Odpowiedz

10

Spójrz na zdekompilowaną metodę: Sqrt.

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

Występuje błąd zaokrąglenia spowodowany użyciem współrzędnych biegunowych i radianów. value.Phase/2.0 zwróci wartość pi/2, która nie jest dokładnie reprezentowalna. Podczas konwersji ze współrzędnych biegunowych (1, pi/2) błąd zaokrąglenia staje się widoczny, gdy rzeczywista współrzędna zbliża się do zera.

Powiązane problemy