अन्य सूत्र में मेरा जवाब पूरी तरह से सही नहीं है:।
असल में, जब रनटाइम पर अभिकलन,
(byte)(64/0.8f)
है।
जब एक float
कास्टिंग 64/0.8f
का परिणाम युक्त byte
रनटाइम पर करने के लिए, परिणाम वास्तव में 80 हालांकि, इस मामले में जब डाली काम के एक भाग के रूप में किया जाता है नहीं है:
float f1 = (64/0.8f);
byte b1 = (byte) f1;
byte b2 = (byte)(64/0.8f);
Console.WriteLine(b1); //80
Console.WriteLine(b2); //79
जबकि बी 1 में अपेक्षित परिणाम शामिल है, बी 2 बंद है। disassembly के अनुसार, बी 2 निम्नलिखित के रूप में असाइन किया गया है:
mov dword ptr [ebp-48h],4Fh
इस प्रकार, संकलक रनटाइम पर परिणाम से एक अलग परिणाम की गणना करने लगता है। मुझे नहीं पता, हालांकि, अगर यह अपेक्षित व्यवहार है या नहीं।
संपादित: शायद यह प्रभाव पास्कल Cuoq वर्णित है: संकलन समय के दौरान, सी # संकलक double
का उपयोग करता है अभिव्यक्ति की गणना करने के। इसका परिणाम 7 9, xxx है जो 79 तक छोटा हो गया है (एक डबल के रूप में एक समस्या का कारण बनने के लिए पर्याप्त परिशुद्धता है)।
फ्लोट का उपयोग करते हुए, हालांकि, हम वास्तव में किसी समस्या में नहीं चलते हैं, क्योंकि फ़्लोटिंग-पॉइंट "त्रुटि" एक फ्लोट की सीमा के भीतर नहीं होती है।
रनटाइम के दौरान, यह एक भी प्रिंट 79:
double d1 = (64/0.8f);
byte b3 = (byte) d1;
Console.WriteLine(b3); //79
EDIT2:
int sixtyfour = Int32.Parse("64");
byte b4 = (byte)(sixtyfour/0.8f);
Console.WriteLine(b4); //79
परिणाम 79 तो है: पास्कल Cuoq के अनुरोध के रूप में, मैं निम्नलिखित कोड भाग गया उपरोक्त कथन कि संकलक और रनटाइम एक अलग परिणाम की गणना सही नहीं है।
EDIT3:
byte b5 = (byte)(float)(sixtyfour/0.8f);
Console.WriteLine(b5); //80
हालांकि, ध्यान दें कि इस मामले में जब में (परिणाम लिख नहीं है: जब (पास्कल Cuoq के लिए क्रेडिट, फिर से) करने के लिए पिछले कोड में परिवर्तन, परिणाम 80 है 79): (byte)(64/0.8f)
एक float
के रूप में मूल्यांकन नहीं है, लेकिन एक double
के रूप में मूल्यांकन (byte
करने के लिए इसे कास्टिंग) से पहले:
byte b6 = (byte)(float)(64/0.8f);
Console.WriteLine(b6); //79
तो यहाँ क्या हो रहा प्रतीत हो रहा है है। इसका परिणाम एक गोल त्रुटि में होता है (जो तब नहीं होता है जब गणना float
का उपयोग करके की जाती है)। दो बार कास्टिंग करने से पहले तैरने के लिए एक स्पष्ट कलाकार (जिसे रीशेपर, बीटीडब्लू द्वारा अनावश्यक के रूप में चिह्नित किया जाता है) इस मुद्दे को हल करता है। हालांकि, जब संकलन समय के दौरान गणना की जाती है (संभवतः केवल स्थिरांक का उपयोग करते समय), float
पर स्पष्ट कास्ट अनदेखा/अनुकूलित किया जाता है।
टीएलडीआर: फ़्लोटिंग पॉइंट गणना प्रारंभिक रूप से दिखाई देने से कहीं अधिक जटिल होती है।
आगे अनुसंधान करने के लिए उपरोक्त - महान खोज! – Matthias