随笔- 5  文章- 0  评论- 1 

很简单的一段程序

 


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

 

Tag标签: GCC
 posted on 2008-07-20 03:02 括号饭 阅读(103) 评论(0)  编辑 收藏 所属分类: 基础知识思考疑问

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-20 03:04 编辑过


相关链接: