我有以下代碼:差介乎VS2012和VS2015
float a = 0.02f * 28f;
double b = (double)a;
double c = (double)(0.02f * 28f);
Console.WriteLine(String.Format(" {0:F20}", b));
Console.WriteLine(String.Format(" {0:F20}", c));
然而它返回不同的結果是否它是從VS2012或VS2015編譯(兩者都具有「標準」的設置)
在VS2012
0,56000000238418600000
0,55999998748302500000
在VS2015:
0,56000000238418600000
0,56000000238418600000
VS2012 dissasembly:
float a = 0.02f * 28f;
0000003a mov dword ptr [ebp-40h],3F0F5C29h
double b = (double)a;
00000041 fld dword ptr [ebp-40h]
00000044 fstp qword ptr [ebp-48h]
double c = (double)(0.02f * 28f);
00000047 fld qword ptr ds:[001D34D0h]
0000004d fstp qword ptr [ebp-50h]
VS2015 dissasembly:
float a = 0.02f * 28f;
001E2DE2 mov dword ptr [ebp-40h],3F0F5C29h
double b = (double)a;
001E2DE9 fld dword ptr [ebp-40h]
001E2DEC fstp qword ptr [ebp-48h]
double c = (double)(0.02f * 28f);
001E2DEF fld dword ptr ds:[1E2E7Ch]
001E2DF5 fstp qword ptr [ebp-50h]
正如我們所看到的拆卸是不相同在這兩種情況下,這正常嗎?這可能是VS2012或VS2015中的錯誤嗎?或者這種行爲是由一些被改變的具體設置控制的? 謝謝!
我的第一個猜測是,有對羅斯林和/或不同的不同buildparams。網絡版本導致這個 –
是這個調試或發佈? 64位版本的結果是什麼? 32位構建使用x87,因此它不像SSE2 –
那樣快速且一致,組裝列表相同,但地址相同。數據段選擇器ds:[...]指向一個編譯時常量(顯然,0.02f * 28f的結果會被烘焙到程序集中)。在運行時沒有乘法。 – dlatikay