很简单的一段程序
#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的浮点支持比较差导致的(隐式类型转换).