मैंने सी # कंपाइलर द्वारा फ्लोट राउंडिंग/ट्रंकेशन के साथ एक दिलचस्प व्यवहार देखा है। अर्थात्, जब एक फ्लोट शाब्दिक गारंटीकृत प्रतिनिधित्व योग्य सीमा (7 दशमलव अंक) से परे है, तो ए) स्पष्ट रूप से फ्लोट (एक अर्थात् अनावश्यक ऑपरेशन) के लिए एक फ्लोट परिणाम कास्टिंग कर रहा है और बी) स्थानीय चर में इंटरमीडिएट गणना परिणामों को संग्रहीत करने से आउटपुट बदल जाता है। एक उदाहरण:फ्लोट वैरिएबल बनाम फ्लोट चर के साथ अजीब कंपाइलर व्यवहार
using System;
class Program
{
static void Main()
{
float f = 2.0499999f;
var a = f * 100f;
var b = (int) (f * 100f);
var c = (int) (float) (f * 100f);
var d = (int) a;
var e = (int) (float) a;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
}
}
उत्पादन होता है:
205
204
205
205
205
अपने कंप्यूटर पर JITted डीबग बिल्ड में, ख गणना निम्न प्रकार है:
var b = (int) (f * 100f);
0000005a fld dword ptr [ebp-3Ch]
0000005d fmul dword ptr ds:[035E1648h]
00000063 fstp qword ptr [ebp-5Ch]
00000066 movsd xmm0,mmword ptr [ebp-5Ch]
0000006b cvttsd2si eax,xmm0
0000006f mov dword ptr [ebp-44h],eax
जबकि घ
के रूप में गणना की जाती है var d = (int) a;
00000096 fld dword ptr [ebp-40h]
00000099 fstp qword ptr [ebp-5Ch]
0000009c movsd xmm0,mmword ptr [ebp-5Ch]
000000a1 cvttsd2si eax,xmm0
000000a5 mov dword ptr [ebp-4Ch],eax
अंत में, मेरी तलाश चालू: आउटपुट की दूसरी पंक्ति चौथी से अलग क्यों है? क्या वह अतिरिक्त एफएमयूएल इतना अंतर बनाता है? यह भी ध्यान रखें कि अगर फ्लोट एफ से अंतिम (पहले से ही प्रस्तुत नहीं किया जा सकता) अंक हटा दिया जाता है या यहां तक कि कम हो जाता है, तो सब कुछ "जगह में पड़ता है"।
मैं यहाँ इस सवाल का जवाब देने के देखा था, लेकिन इसे – Andrey