Das Ergebnis des folgenden Programms ist mir auf meinem Rechner etwas seltsam.Warum scheint der Wert von double nach der Zuweisung geändert zu werden?
#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;
}
Ausgang:
$ ./test
a < b * c
ich doppelt weiß, ist nicht, dass genau wegen der Präzision. Aber ich erwarte nicht, dass sich der Wert ändert und ein inkonsistentes Vergleichsergebnis ergibt. Wenn die a < b * c
ausgedruckt wird, erwarte ich, dass a < d
auch gedruckt werden sollte. Aber wenn ich diesen Code auf meinem i686-Server und sogar auf meinem Cygwin laufen lasse. Ich kann a < b * c
sehen, kann aber a < d
nicht sehen.
Es wurde bestätigt, dass dieses Problem plattformabhängig ist. Wird dies durch die unterschiedliche Instruktion und Durchführung der Doppelbelegung verursacht?
UPDATE
Die generierte Assembly:
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
Vielleicht hat es etwas mit ständiger Optimierung zu tun. Kannst du die Assembly zeigen oder reproduzieren, wenn du 'a',' b' und 'c' von' std :: cin' nimmst? –
Keine Fehler/Warnungen vom Compiler. – StarPinkER
Ich kann es reproduzieren Wenn ich es von Std :: Cin bekomme, werde ich die Montage später veröffentlichen. @NateKohl – StarPinkER