【发布时间】:2014-03-24 16:50:03
【问题描述】:
以下程序的结果在我的机器上对我来说有点奇怪。
#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
我知道由于精度,double 并不那么准确。但我不希望该值发生变化并给出不一致的比较结果。
如果a < b * c 被打印出来,我确实希望a < d 也应该被打印出来。但是当我在我的 i686 服务器甚至我的 cygwin 上运行这段代码时。我可以看到a < b * c,但看不到a < d。
已确认此问题与平台有关。这是双重赋值的指令和实现方式不同造成的吗?
更新
生成的程序集:
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,您能否展示或复制它? -
编译器没有错误/警告。
-
我可以复制它如果我从 std::cin 得到它,我稍后会发布程序集。 @NateKohl
-
打印后确认值相同。 @vdbuilder
-
我没有得到 x87 和 SSE 代码的输出。您可以在coliru.stacked-crooked.com/a/3022f77c07303e32查看结果并自己编辑代码您使用的是什么编译器?你的机器 AS3 到底是什么?
标签: c++ compiler-construction architecture