निम्नलिखित सी # कोड पर विचार करें में कई युगल जोड़ने राउंडिंग प्रभावित करता है? बात यह है, यह नहीं है। परिणाम 1 3.3 है और परिणाम 2 3.3000000000000003 है। केवल अंतर ही स्थिरांक का क्रम है।क्यों आदेश जब सी #
मुझे पता है कि युगल इस तरह से लागू किए गए हैं कि गोल करने वाले मुद्दे हो सकते हैं। मुझे पता है कि अगर मुझे पूर्ण परिशुद्धता की आवश्यकता है तो मैं decimals का उपयोग कर सकते हैं। या मैं अपने अगर कथन में Math.Round() का उपयोग कर सकता हूं। मैं सिर्फ एक बेवकूफ़ हूं जो समझना चाहता हूं कि सी # कंपाइलर क्या कर रहा है। क्या कोई मुझे बता सकता है?
संपादित करें:
हर किसी के लिए धन्यवाद है जो अब तक चल बिन्दु गणित पर पढ़ने का सुझाव दिया और/या की कैसे सीपीयू युगल संभालती निहित अशुद्धि के बारे में बात की थी। लेकिन मुझे लगता है कि मेरे प्रश्न का मुख्य जोर अभी भी अनुत्तरित है। इसे सही तरीके से phrasing नहीं करने के लिए मेरी गलती कौन सा है। मुझे इसे इस तरह रखते हैं:
नीचे से ऊपर कोड को तोड़ने, मैं उम्मीद करेंगे निम्न कार्रवाई हो रहा हो रहे हैं:
double r1 = 1.1 + 1.2;
double r2 = 1.0 + r1
double r3 = 1.0 + 1.1
double r4 = 1.2 + r3
मान लेते हैं कि ऊपर अतिरिक्त में से प्रत्येक के एक गोलाई त्रुटि (गिने E1 था करते हैं। ।ई 4)। तो आर 1 में गोलाकार त्रुटि ई 1 है, आर 2 में गोलाकार त्रुटियां शामिल हैं ई 1 + ई 2, आर 3 में ई 3 और आर 4 में ई 3 + ई 4 शामिल है।
अब, मुझे नहीं पता कि राउंडिंग त्रुटियां कैसा चलती हैं लेकिन मैं ई 1 + ई 2 के बराबर ई 3 + ई 4 की अपेक्षा करता। स्पष्ट रूप से यह नहीं है, लेकिन ऐसा लगता है कि यह मेरे लिए गलत है। एक और बात यह है कि जब मैं उपरोक्त कोड चलाता हूं, तो मुझे कोई गोल करने वाली त्रुटियां नहीं मिलती हैं। यही कारण है कि मुझे लगता है कि यह सी # कंपाइलर है जो सीपीयू की बजाय अजीब कुछ कर रहा है।
मुझे पता है कि मैं बहुत कुछ पूछ रहा हूं और शायद सबसे अच्छा जवाब देने वाला कोई भी सीपीयू डिज़ाइन में पीएचडी करना है, लेकिन मैंने सोचा कि मैं पूछूंगा।
संपादित 2
अपने मूल कोड नमूने से आईएल को देखते हुए, यह स्पष्ट है कि यह संकलक सीपीयू नहीं कि ऐसा है:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] float64 result1,
[1] float64 result2)
L_0000: nop
L_0001: ldc.r8 3.3
L_000a: stloc.0
L_000b: ldc.r8 3.3000000000000003
L_0014: stloc.1
L_0015: ret
}
संकलक के लिए संख्या को जोड़कर किया जाता है मुझे!
+1 अच्छा ठोस उदाहरण – bobince
उदाहरण अच्छा है, लेकिन आपने मूल कोड की तुलना में संचालन के क्रम को बदल दिया है। ओपी ने पहले संपादन में वही किया था। –