IEEE 浮点数格式

前言

IEEE 754 标准规定了三种浮点数格式:单精度、双精度、扩展精度。Intel 计划给最早的 8086 增加浮点运算单元 (FPU) 时,他们请来了最好的数值分析专家来为 8087 FPU 设计浮点数格式,这位专家接着又请来了该领域的另外两位专家,这三个人 (Kahn, coonan 与 Stone) 设计了 Intel 的浮点格式,即 KCS 浮点数标准。这个标准实在太出色了,因此 IEEE 组织将 KCS 选作为 IEEE 浮点数格式的基础,即 IEEE 标准 754。


单精度浮点数

IEEE 754 标准所定义的单精度浮点数的长度为 32 位,按位域可划分为:符号位、阶码位与尾数位,如下:

s eee  eeee  e xxx  xxxx  xxxx  xxxx  xxxx  xxxx

其中,s表示符号位,e表示指数位(8位),而x表示底数位(23位)。

浮点数值定义如下:

f = (s ? -1 : 1) * (1 + 0.x) * 2 ^ (e-127)

简要说明一下:

- 通过 127 这个偏移量 (移码),可以区分出指数的正负。阶码为 127 时表示指数为 0;阶码小于 127 时表示负指数;阶码大于 127 时表示正指数。

- 所有的23位尾数位均表示小数位。

- IEEE 754规定实际的尾数等于23位尾数所定义的小数加上1。这也就是说 IEEE 754 标准所定义的浮点数,其有效数字是介于 1 与 2 之间的小数。

- 使用 23 位尾数,大概可以得到6.5位有效十进制数字


单精度浮点数范例

将 17.625 换算成 float 型。

首先, 先将 17.625 换算成 2 进位: 10001.101 (什么 ?? 你问我小数是怎么换的 ?? 好吧,就告诉你好了, 因为0.625 = 0.5 + 0.125 , 0.5 即 1/2 , 0.125 即 1/8 , 所以0.625 换算成 2 进位是 0.101 , 如果你还没懂, 请你再问别人. 当然, 这裡的数字是为了讲解方便才用这么完美的小数,实际的小数部份, 是用无限逼近出来的.) 

再来将 10001.101 向右 shift 直到小数点前只剩一位 (这一位数当然是 1), 变成了 1.0001101 x 2 的 4 次方 (因为向右移了4 位). 此时, 我们要的底数和指数就出来了: 底数部份,因为小数点前必为 1, 所以 IEEE 规定只记录小数点后的就好, 所以此题的底数为 0001101 . 指数部份实际为 4, 但在格式中须加上127 , 固为 131 , 即二进位的 10000011.

综合上列各项, 17.625 的 float 储存格式就是:

  0 10000011 00011010000000000000000

转换成 byte : 41 8D 00 00

另外, 因为 INTEL CPU 是 little endian 的, 所以41 8D 00 00 在内存中是按 00 00 8D 41 的顺序放的. (位址由低到高)


双精度浮点数

相对于单精度浮点数格式,双精度的阶码变为 11 位,移码变为为 1,023,尾数变为 52 位。这样,再加上符号位,双精度浮点数的长度为 64 位,提供了大约 (10^-308, 10^308)的动态范围以及14.5位有效十进制数字。


扩展精度浮点数

为了追求更高的浮点运算精度,Intel 又搞出来扩展精度格式。扩展精度的浮点数长度为 80 个位,相对于双精度浮点数所多出来的 16 个位,有 12 位加入到尾数位中,有 4 位加入到阶码位中。

据说 Intel IA32 架构的的 FPU都是采用扩展精度浮点数进行运算的。当程序调入单、双精度浮点数时,FPU 将它们转为扩展精度,运算结束后再将结果转成 (四舍五入) 对应的单、双精度浮点数。


文章来源:

http://liyanrui.is-programmer.com/posts/3806.html

http://sohu2000000.blog.163.com/blog/static/11921260201042410328131/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值