我在看书计算机系统:程序员的视角,我试图执行它在我的MacBook Pro上提供的代码与英特尔酷睿i7 。学习所需的环境设置“*计算机系统:程序员的视角*”
但是有些代码并不完全按照本书的建议运行。
这个C示例应该证明,当存储在存储器中时,相同的浮点数将存储在寄存器中时会有所不同。
#include<stdio.h>
double recip(int denom)
{
return 1.0/(double) denom;
}
void do_nothing(){} /* to clear the register */
void fcomp(int denom)
{
double r1, r2;
int t1, t2;
r1 = recip(denom); /* stored in memory */
r2 = recip(denom); /* stored in register */
t1 = r1 == r2; /* Compares register to memory */
do_nothing(); /* Forces register save to memory */
t2 = r1 == r2; /* Compares memory to memory */
printf("test1 t1: r1 %f %c= r2 %f\n", r1, t1 ? '=' : '!', r2);
printf("test1 t1: r2 %f %c= r2 %f\n", r1, t2 ? '=' : '!', r2);
}
main(){
int demon = 10;
fcomp(demon);
}
与 “O2” 选项,结果,通过这本书提出了gcc相比,应该是:
test1 t1: r1 0.100000 != r2 0.100000
test2 t1: r1 0.100000 == r2 0.100000
不过,我有两个 “==” S,不知为什么。有关该书的环境设置的任何建议?非常感谢。
您应该将本书保存在干燥的桌面上,避免阳光直射... – 2013-10-11 01:37:03
请注意,任何半路体编译器都可以证明对'do_nothing()的调用不起作用,并且不会发出任何代码。顺便说一下,所述编译器还可以可靠地证明'r1'和'r2'应该具有相同的值,并且优化你的赋值,并且优化'printf()'调用中的三元运算符直到'=' '。另外,我没有在代码中看到关于寄存器的任何内容,所以对存储在寄存器中的值进行任何假设都是完全没有根据的。 –
这里有些事情是非常错误的。这本书是由知名人士Randal Bryant撰写的。有些书是在线的。你确定你的代码片段是书中的内容吗?什么是章节,部分和页面? –