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. 深入理解计算机系统
2. 朱亚超. 基于IEEE74的浮点数存储格式分析研究
3. abortexit. 从一个C++笔试题看浮点数的表示.
http://blog.csdn.net/abortexit/archive/2009/06/22/4288279.aspx
阅读(1424) | 评论(0) | 转发(0) |