Floating point
基本概念
- 浮点数由三部分组成
- 符号位
- 指数 (Exponent,也称“阶码”)
- 尾数 (Mantissa,也称“有效数” , significand)
- 指数和有效数所使用的位数取决于对数值表示范围和精度的要求
- 规格化 (Normalization) 惯例:有效数的最左边的位总是设置 1
浮点模型
例:基数为 2 的 14 位模型
假设在模型中存储一个十进制数 17
指数部分是 5(00
101
),小数部分是 10001
000(补全0)但这个模型存在的问题是无法表示负指数
- 如果要存储 0.25,就无法完成。
- 0.25 是 ,指数 无法在这个模型中表示。
为解决这个问题,通常的做法是使用偏移 (biased) 指数
- 即在允许的范围内将每一个整数都转化成一个非负整数,这样就可以把每个整数都作为一个二进制数来存储。
- 在指数允许的表示范围之内,首先要通过在每个指数加一个固定偏移值的方法来对整数加以调整。
比如可以选择 16 作为偏移值
- 任何大于 16 的指数将表示为一个正值,而小于 16 的指数表示为一个负值。
- 这种方法被称为16-余 (excess-16) 表示法,需要减去16 才能得到真正的指数值。
- 数字 0.25 则可以表示为
- 指数部分是 (0
1111
),小数部分是1
0000000
浮点误差
计算机进行浮点运算相当于在运用一个有限的整数系统对无限的实数系统行建模。所做的一切事实上只是系统的一个近似 (approximation)。使用的位数越多,这种近似就越好。但是,不管计算机使用多少位数,总是会存在一些误差。
浮点数标准
IEEE-745 浮点标准
单精度标准
Short real
- 采用 32 位储存空间,包括符号位 1 位,阶码 8 位,尾数 23 位
- 当指数等于 255 时,表示的量无穷大或者“ 非数” (NaN,通常用做错误指示)
- 8 位的实际取值范围 0~255,为了使正负指数的位数量均等,则各自一半,偏移值 127,则表示范围 -127~128 (特殊点 0)。
例:Express 178.625 as a short real
- 178 D = 10110010 B, 0.625 D = 0.101 B
- 178.625 D = 10110010.101 B = 1.0110010101 ×
Add bias gives:
- 1.0110010101 × = 1.0110010101 ×
- 134 D=10000110 B
Final result:
双精度标准
- 采用 64 位存储空间,包括符号位1 位,阶码 11 位,尾数 52 位
- 当指数为 2047 时,表示 NaN