很简单的一段程序
#include <stdio.h>
#include <stdlib.h>
double recip(int denom)
{
return 1.0/(double) denom;
}
void do_nothing() {} /* Just like the name says */
void test1(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 t2: r1 %f %c= r2 %f\n", r1, t2 ? '=' : '!', r2);
}
void test2(int denom)
{
double r1;
int t1;
r1 = recip(denom); /* Default: register, Forced store: memory */
t1 = r1 == 1.0/(double) denom; /* Compares register or memory to register */
printf("test2 t1: r1 %f %c= 1.0/10.0\n", r1, t1 ? '=' : '!');
}
int main(int argc, char *argv[])
{
int denom = 10;
/*
int denom = atoi(argv[1]);
*/
test1(denom);
test2(denom);
printf("A long double on this machine requires %d bytes\n", sizeof(long double));
return 0;
}
当未使用编译器优化编译时
当使用编译器优化编译时
第三行数据 前后竟然不一致!在VC编译器上执行未出现这个问题,具体的原因是由于GCC对IA32的浮点支持比较差导致的(隐式类型转换).