Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1522720
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类: C/C++

2010-07-31 11:35:11

指数为8位,可表示指数范围±127,存储时加127的bias;
尾数的最高位为1,存储时省略(隐含),即只存储23位;
 
指数部分为什么加127的偏移?
为了使浮点0的表示与机器0的表示一样。可以通过下面的方法得到浮点0
将一个很小的规格化浮点数再细分,可得到非规格化浮点数,再细分,得到非规格化浮点数,再细分,下溢出,得到浮点0!
 
 

#include <iostream>
using namespace std;

typedef unsigned long DWORD;
// little-endian
typedef union float_tag
{
 DWORD dw;
 struct
 {
  unsigned int bM:23; // sizeof(int) = 4
  int bE:8;
  int bS:1;
 }field;
}FS;

void main()
{
 int i;
 float fv;
 char *pfv;
 pfv = (char *)&fv;
 FS *pfsv = (FS*)&fv;

 pfsv->dw = 0x80000000; // -0
 if(fv == 0)
  cout<<"-0 == +0";
 else
  cout<<"-0 != +0";
 cout<<endl<<endl;

 pfsv->field.bS = 0;
 pfsv->field.bE = 127; // exp=0
 pfsv->field.bM = 0x12345678; // 截取低23位

 cout<<"构造一个浮点值 S:0 E:(0)d M:0x12345678 "<<fv<<endl;
 cout<<"其内存表示为 0x"<<hex<<pfsv->dw<<endl<<endl;
 
 // 构造一系列浮点数
 puts("构造一系列浮点数\n");
 for(i=0; i<24; i++)
 {
  pfsv->field.bS = 0;
  pfsv->field.bE = 127; // exp=0
  pfsv->field.bM = 1<<i; // 截断取低23位

  printf("构造一个浮点值 S:0 E:(0)d M:x \n", 1<<i);
  printf("内存表示 0xx\n", pfsv->dw);
  printf("fv=%e %s\n\n", fv, fv>1?">1":"<=1");
 }

 // 从正方向趋向于0的浮点数
 puts("从正方向趋向于0的浮点数");
 pfsv->field.bS = 0;
 pfsv->field.bE = 1; // exp=-126
 pfsv->field.bM = 1<<0; // 截断取低23位

 printf("构造一个浮点值 S:0 E:(-127)d M:x \n", 1<<0);
 printf("内存表示 0xx\n", pfsv->dw);
 printf("fv=%e %s\n\n", fv, fv>0?">0":"<=0");
 for(i=0; i<40; i++)
 {
  fv = fv/(1<<i);
  printf("右移 %d ", i);
  printf("内存表示 0xx\n", pfsv->dw);
  printf("fv=%e %s\n\n", fv, fv>0?">0":"<=0, Get it!");
 }

 // 从负方向趋向于0的浮点数

 puts("从负方面趋向于0的浮点数");
 pfsv->field.bS = 1;
 pfsv->field.bE = 1; // exp=-126
 pfsv->field.bM = 1<<0; // 截断取低23位

 printf("构造一个浮点值 S:0 E:(-127)d M:x \n", 1<<0);
 printf("内存表示 0xx\n", pfsv->dw);
 printf("fv=%e %s\n\n", fv, fv>=0?">=0":"<0");
 for(i=0; i<40; i++)
 {
  fv = fv/(1<<i);
  printf("右移 %d ", i);
  printf("内存表示 0xx\n", pfsv->dw);
  printf("fv=%e %s\n\n", fv, fv>=0?">=0, Get it!":"<0");
 }
}


 

 

-0 == +0

构造一个浮点值 S:0 E:(0)d M:0x12345678 1.40889
其内存表示为 0x3fb45678

构造一系列浮点数

构造一个浮点值 S:0 E:(0)d M:00000001
内存表示 0x3f800001
fv=1.000000e+000 >1

构造一个浮点值 S:0 E:(0)d M:00000002
内存表示 0x3f800002
fv=1.000000e+000 >1

构造一个浮点值 S:0 E:(0)d M:00000004
内存表示 0x3f800004
fv=1.000000e+000 >1

...

构造一个浮点值 S:0 E:(0)d M:00400000
内存表示 0x3fc00000
fv=1.500000e+000 >1

构造一个浮点值 S:0 E:(0)d M:00800000
内存表示 0x3f800000
fv=1.000000e+000 <=1

从正方向趋向于0的浮点数

构造一个浮点值 S:0 E:(-127)d M:00000001
内存表示 0x00800001
fv=1.175494e-038 >0

右移 0 内存表示 0x00800001
fv=1.175494e-038 >0

右移 1 内存表示 0x00400000
fv=5.877472e-039 >0

...

右移 6 内存表示 0x00000004
fv=5.605194e-045 >0

右移 7 内存表示 0x00000000
fv=0.000000e+000 <=0, Get

...

右移 21 内存表示 0x00000000
fv=0.000000e+000 <=0, Get

...

右移 39 内存表示 0x80000000
fv=0.000000e+000 <=0, Get

从负方面趋向于0的浮点数
构造一个浮点值 S:0 E:(-127)d M:00000001
内存表示 0x80800001
fv=-1.175494e-038 <0

右移 0 内存表示 0x80800001
fv=-1.175494e-038 <0

右移 1 内存表示 0x80400000
fv=-5.877472e-039 <0

...

右移 7 内存表示 0x80000000
fv=0.000000e+000 >=0, Get

...

右移 39 内存表示 0x00000000
fv=0.000000e+000 >=0, Get


阅读(5702) | 评论(0) | 转发(0) |
0

上一篇:宏定义示例

下一篇:喝粥洗碗,找回自己

给主人留下些什么吧!~~