很简单的一段程序

 


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

 

 posted on 2008-07-20 03:02  括号饭  阅读(882)  评论(0编辑  收藏  举报