2012-10-09 24 views
8

Tôi kinh ngạc khi thấy rằng loại dữ liệu System.Numerics.Complex trong .NET không mang lại kết quả chính xác về mặt toán học.Tại sao loại phức tạp của .NET bị hỏng?

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

Thay vì (0, 1), tôi nhận được (6.12303176911189E-17, 1), trông giống như lỗi làm tròn.

Bây giờ tôi nhận ra rằng số học dấu chấm động sẽ dẫn đến kết quả như thế này đôi khi, nhưng thường sử dụng số nguyên sẽ tránh làm tròn lỗi.

Tại sao hoạt động dường như cơ bản này lại mang lại kết quả rõ ràng sai?

+3

Loại không bị hỏng, không có lý do gì cho các vở kịch. –

+3

@ HenkHolterman Vâng, đó là từ tốt nhất tôi có thể tìm thấy để mô tả nó. –

+0

Có thể trùng lặp với [Vấn đề chính xác kép trên .NET] (http://stackoverflow.com/q/566958/60761) và nhiều thứ khác. –

Trả lời

10

Nhìn vào phương pháp Sqrt bị biên dịch.

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

Trên thực tế, có lỗi làm tròn do sử dụng tọa độ cực và radian. value.Phase/2.0 sẽ trả lại pi/2, đây không phải là số chính xác. Khi chuyển đổi từ các tọa độ cực (1, pi/2), lỗi làm tròn sẽ hiển thị khi toạ độ thực gần bằng không.

Các vấn đề liên quan