Результат следующей программы немного странен для меня на моей машине.
#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