在我的機器上,以下程序的結果對我來說有點奇怪。爲什麼double的值似乎在賦值後被改變?
#include <iostream>
using namespace std;
int main(){
double a = 20;
double b = 0.020;
double c = 1000.0;
double d = b * c;
if(a < b * c)
cout << "a < b * c" << endl;
if(a < d)
cout << "a < d" << endl;
return 0;
}
輸出:
$ ./test
a < b * c
我知道雙是因爲精度不準確。但我並不認爲這個價值會發生變化,並會導致不一致的比較結果。
如果打印出a < b * c
,我確實希望a < d
也應該打印出來。但是當我在我的i686服務器上甚至在我的cygwin上運行這個代碼。我可以看到a < b * c
,但看不到a < d
。
此問題已被確認爲與平臺相關。這是由雙重任務的不同指令和執行引起的嗎?
UPDATE
生成的組件:
main:
.LFB1482:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
subl $56, %esp
.LCFI2:
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
movl $0, -8(%ebp)
movl $1077149696, -4(%ebp)
movl $1202590843, -16(%ebp)
movl $1066695393, -12(%ebp)
movl $0, -24(%ebp)
movl $1083129856, -20(%ebp)
fldl -16(%ebp)
fmull -24(%ebp)
fstpl -32(%ebp)
fldl -16(%ebp)
fmull -24(%ebp)
fldl -8(%ebp)
fxch %st(1)
fucompp
fnstsw %ax
sahf
ja .L3
jmp .L2
//.L3 will call stdout
也許它是與不斷優化。如果從'std :: cin'中抓住'a','b'和'c',你能顯示程序集還是重現它? –
沒有來自編譯器的錯誤/警告。 – StarPinkER
我可以重現它如果我從std :: cin得到它,我會在稍後發佈它。 @NateKohl – StarPinkER