2012-10-09 15 views
8

Me quedé asombrado al descubrir que el tipo de datos System.Numerics.Complex en .NET no arroja resultados matemáticamente precisos.¿Por qué se rompe el tipo Complex de .NET?

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

En lugar de (0, 1), consigo (6.12303176911189E-17, 1), que se parece mucho a un error de redondeo.

Ahora me doy cuenta de que la aritmética de punto flotante dará resultados como este a veces, pero generalmente el uso de enteros evitará errores de redondeo.

¿Por qué esta operación aparentemente básica produce un resultado obviamente incorrecto?

+3

El tipo no está roto, no hay razón para la dramatización. –

+3

@HenkHolterman Bueno, esa es la mejor palabra que pude encontrar para describirlo. –

+0

Posible duplicado de [Problemas de precisión doble en .NET] (http://stackoverflow.com/q/566958/60761) y muchos otros. –

Respuesta

10

Mire el método descompilado Sqrt.

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

De hecho, se ha producido un error de redondeo causado por el uso de coordenadas polares y radianes. value.Phase/2.0 devolverá pi/2, que no es un número exactamente representable. Al convertir desde coordenadas polares (1, pi/2), el error de redondeo se vuelve visible cuando la coordenada real se acerca a cero.

Cuestiones relacionadas