浮点数的机器表示
目录 Table of Contents
目录
- IEEE 的浮点数标准
IEEE 754 的标准 - Rounding (舍入)
跟浮点数相关的一些舍入的一些问题
给你个实数, 让它表示成为浮点数, 也就是计算机内部的浮点数的表示
其中牵扯的主要的一步, 就是这个 Rounding 怎么去做 - C 语言中的浮点数
它跟我们机器层面的浮点数表示, 大概有什么样的关系
IEEE Floating Point
首先讲 IEEE 的这个浮点数 Floating Point 的标准, 这个标准叫 IEEE 的 754 标准
首先我们看这张图
(IEEE 图)

确切来说应该是一个用二进制方式来表示一个实数, 实际上也是 0101 串的模式, 这和整数是一样的.
整数无非是把小数点放在 0101 串的最右侧, 现在浮点数就是放在中间了. 一部分表示整数部分, 另一部分表示小数部分.
然后它每个 b0 b1 b2 乘上它所在的二进制的这个权重
(图二进制表示方式)

- 这两个图就是把二进制转换成十进制
那么给定一些实数, 怎么进行二进制浮点数表示, 这个很简单.
就是把它分成两个部分, 整数和小数部分, 然后中间加个点.
当然, 这有一定的局限性.
只能精确表示 X/2^k 这种形式也就是 2 的整数次幂这种形式的数据.
当然 2 的整数次幂可以是正的也可以是负的.
计算机中浮点数的表示
- 数字形式
(图数字形式)

符号位 s 就是完完全全只表示一个符号, 这点和整数不同, 0 的话就是正, 1 的话就是负.
在整数的表示中, 这个符号位还占有一定的权重, 这点不一样.
- 编码
(图编码)

最后我们把这个表示方式落实到计算机里面的存储.
它也是分成了 3 个域, 就是 3 个 0101 串, s m e 组合起来也是一个 0101 串
exp 域就表示 E
frac 域就表示这个 M
注意这两者并不是完全相等的, 它们之间有一个简单的换算关系. 这个换算关系后面再说.
编码
这个编码就是一个浮点数, 它有三个域, 三个域连起来 010101 的存在于计算机内部, 这是它的编码表示.
浮点数分三种 :
- 单精度浮点数 : exp 域的宽度为 8 bit, frac 域宽度为 23 bit; 总共 32 bit
- 双精度浮点数 : exp 域宽度为 11 bit, frac 域宽度为 52 bit; 总共 64 bit
- 扩展精度浮点数 : exp 域宽度为 15 bit, frac 域宽度为 63 bit; 总共 80 bit (1 bit wasted)