Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150716
  • 博文数量: 38
  • 博客积分: 1718
  • 博客等级: 上尉
  • 技术积分: 350
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-13 14:47
文章分类

全部博文(38)

文章存档

2012年(1)

2011年(11)

2010年(8)

2009年(18)

我的朋友

分类:

2009-06-28 14:41:20

IEEE浮点数标准

IEEE标准规定,浮点数V表示为:
  V = (-1)**s*M*2**E
其中符号“**”表示指数,“*”表示乘操作。IEEE规定:
  • S为符号为,当S为1时表示负数;
  • M表示有效数;
  • E表示指数。
浮点数的位表示形式被分为3个部分,如下图所示单精度在Intel处理器上存储方式:
----------------------- 
|31|30 ... 23|22 ... 0|
----------------------- 
|s |   E     |   f    |
-----------------------

The value V represented by the word may be determined as follows:

  • If E=255 and F is nonzero, then V=NaN ("Not a number")
  • If E=255 and F is zero and S is 1, then V=-Infinity
  • If E=255 and F is zero and S is 0, then V=Infinity
  • If 0
  • If E=0 and F is nonzero, then V=(-1)**S * 2 ** (-126) * (0.F) These are "unnormalized" values.
  • If E=0 and F is zero and S is 1, then V=-0
  • If E=0 and F is zero and S is 0, then V=0
为了便于理解,现举一个例子来说明:
下面是一个C++的笔试题:
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; //
输出什么?

为了解答该问题,首先需要知道浮点数1.0的二进制表示方式:
1.0是规格化的浮点数,所以1.0遵循
V=(-1)**S * 2 ** (e-127) * (1.F)
S = 0;
F = 0;
E = e - 127 = 0知道 e = 127。(根据IEEE标准规定,单精度浮点数中e为用8位
二进制数表示的无符号整数,即 0<= e <= 255)。
由此得知单精度浮点数1.0的二进制表示为:
  0X3F800000
至此,可以知道上述面试题的输出分别为:
1
1065353216
false
参考文献:
1. 深入理解计算机系统
2. 朱亚超. 基于IEEE74的浮点数存储格式分析研究
3. abortexit. 从一个C++笔试题看浮点数的表示.
   http://blog.csdn.net/abortexit/archive/2009/06/22/4288279.aspx 


阅读(1417) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~