2012-10-09 14 views
8

मुझे यह पता लगाने के लिए आश्चर्य हुआ कि System.Numerics.Complex .NET में डेटा प्रकार गणितीय सटीक परिणाम नहीं देता है।.NET का कॉम्प्लेक्स प्रकार क्यों टूटा हुआ है?

Complex.Sqrt(-1) != Complex.ImaginaryOne 
बजाय

(0, 1), मैं (6.12303176911189E -17, 1), एक गोलाई त्रुटि की तरह एक बहुत लग रहा है जो।

अब मुझे एहसास है कि फ्लोटिंग पॉइंट अंकगणित कभी-कभी इस तरह के परिणाम प्राप्त करेगा, लेकिन आम तौर पर पूर्णांक का उपयोग करने से त्रुटियों को गोल करने से बचा जाएगा।

यह प्रतीत होता है कि मूल रूप से मूल संचालन स्पष्ट रूप से गलत परिणाम क्यों देता है?

+3

प्रकार टूटा नहीं है, नाटकीय के लिए कोई कारण नहीं है। –

+3

@ हेनकहोल्टरमैन वेल, यह सबसे अच्छा शब्द है जिसे मैं इसका वर्णन करने के लिए पा सकता हूं। –

+0

[.NET] पर डबल सटीक समस्याओं का संभावित डुप्लिकेट (http://stackoverflow.com/q/566958/60761) और कई अन्य। –

उत्तर

10

decompiled Sqrt विधि को देखें।

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

वास्तव में ध्रुवीय निर्देशांक और रेडियंस का उपयोग करके एक गोल करने वाली त्रुटि है। value.Phase/2.0 पीआई/2 लौटाएगा, जो वास्तव में प्रतिनिधित्व करने योग्य संख्या नहीं है। ध्रुवीय निर्देशांक (1, पीआई/2) से कनवर्ट करते समय, वास्तविक समन्वय शून्य के करीब होने पर राउंडिंग त्रुटि दिखाई देती है।

संबंधित मुद्दे