在此表達的問題,鉸鏈:
bool bLarger2 = (a*c)<b;
我看了看,沒有VS2010 VS2008下生成的代碼交手。對於64位的代碼是:
000000013FD51100 movss xmm1,dword ptr [a]
000000013FD51106 mulss xmm1,dword ptr [c]
000000013FD5110C movss xmm0,dword ptr [b]
000000013FD51112 comiss xmm0,xmm1
對於32位的代碼是:
00FC14DC fld dword ptr [a]
00FC14DF fmul dword ptr [c]
00FC14E2 fld dword ptr [b]
00FC14E5 fcompp
所以在32位的的x87單元執行計算,並在64位它是由進行x64單位。
這裏的區別在於x87的操作都是以高於單精度的方式執行的。默認情況下,計算是以雙精度執行的。另一方面,上證所單位操作是純粹的單精度計算。
可以說服32位爲單位來執行所有計算,單精度精度是這樣的:
_controlfp(_PC_24, _MCW_PC);
當您添加到您的32位程序,你會發現布爾值都設置爲false。
x87和SSE浮點單元的工作方式有一個根本性的區別。 x87單元對於單精度和雙精度類型都使用相同的指令。數據加載到x87 FPU堆棧中的寄存器中,並且這些寄存器始終是10個字節的Intel擴展。您可以使用浮點控制字來控制精度。但編譯器編寫的指令對該狀態一無所知。
另一方面,SSE單元對單精度和雙精度的操作使用不同的指令。這意味着編譯器可以發出完全控制計算精度的代碼。
因此,x87單位在這裏是壞人。你甚至可以試着說服你的編譯器發出SSE指令,即使是32位的目標。當然,當我在VS2013下編譯你的代碼時,我發現32位和64位目標都發出了SSE指令。
我的猜測是x86版本正在使用FPU寄存器,而x64正在使用SSE寄存器。但是您可能需要查看IL代碼以及機器代碼。 – Lev
當然,x86是使用x87單元,而x64是使用SSE單元。但它並沒有真正解釋這種差異。他們都應該得到相同的答案。 @Oliver能否告訴我你是如何編譯代碼的,因爲我試圖在repro上失敗。對於我來說,這兩個bool對於x86和x64都是「虛假」的。 –
好吧,現在我得到了一個repro! –