1.单精度浮点数
1.1 单精度浮点数的格式
- 单精度浮点数 采用 32bit来表示一个浮点数,格式如下:
- 如上图所示单精度浮点数由三部分组成:
- singsingsing:符号位(SSS),0 - 正数; 1:负数
- exponentexponentexponent:指数位(EEE),共占据 8bit8bit8bit,取值范围为 0−2550-2550−255 。
- fractionfractionfraction:分数部分(FFF),共占据 23bit23bit23bit。
1.2 如何理解exponentexponentexponent 和 fractionfractionfraction
- exponentexponentexponent
- 我们知道 单精度浮点数 取值范围为 ±1.17e−38±1.17e^{-38}±1.17e−38 到 ±3.4e38±3.4e^{38}±3.4e38,如果不考虑符号位也就是 [1.17e−38−3.4e381.17e^{-38} - 3.4e^{38}1.17e−38−3.4e38], 那么可以思考一下为什么取值范围是这么一个数呢?
- 这就与指数位 exponentexponentexponent 有关,指数位 exponentexponentexponent 表示为 2(E−127)2^{(E-127)}2(E−127),exponentexponentexponent共 8bit8bit8bit ,取值范围为[0−255][0 - 255][0−255],其中 全0[0] - 和 全1(255) 用作特殊用途,所以 EEE 取值范围为[1−254][1 - 254][1−254], 故指数的取值范围为 [2−126−21272^{-126} - 2^{127}2−126−2127],大约就是[1.17e−38−3.4e381.17e^{-38} - 3.4e^{38}1.17e−38−3.4e38],这也就是 单精度浮点数 的取值范围。
- 那么指数位exponentexponentexponent 为 0 和 255分别代表什么呢?
- E=0E = 0E=0:表示 无穷小 ;E=255E = 255E=255:表示 无穷大,对于单精度浮点数 当取值小于2−1262^{-126}2−126,则用 无穷小 表示,当取值大于21272^{127}2127 就用 无穷大 表示。
- fractionfractionfraction
- 如果只有 exponentexponentexponent ,则只能表示 类似 2−22^{-2}2−2, 2−12^{-1}2−1, 202^{0}20, 212^{1}21, 222^{2}22,随着数值的增大可以说毫无精度可言,这个时候就需要 fractionfractionfraction 发挥作用了。
- fractionfractionfraction 共 23bit23bit23bit, 可表示 2232^{23}223个数,fractionfractionfraction 是 分数分数分数 的意思,例如 F=1F=1F=1 就表示 1/2231/2^{23}1/223, F=2F=2F=2 就表示 2/2232/2^{23}2/223。
- 如何理解这个这种表示方法呢?
- 对于任何一个数(在浮点数的取值范围之内),都会落在 [2n2^n2n - 2n+12^{n+1}2n+1],fractionfractionfraction 就是表示将[2n2^n2n - 2n+12^{n+1}2n+1] 拆分为 2232^{23}223份,通过所占分数确定浮点数精度。
1.3 公式记录
- 有了上述解释,下面浮点数的公式也就很好理解了,此处便不过多解释,仅记录一下
- 通过 S,E,FS, E, FS,E,F 三个参数计算对应浮点数的公式
(−1)S∗(1+F223)∗2(E−127)(-1)^S*(1+\frac F{2^{23}})*2^{(E-127)}(−1)S∗(1+223F)∗2(E−127) - 通过 S,E,FS, E, FS,E,F 三个参数计算对应整形的公式
F+E∗223F+E*2^{23}F+E∗223
1.3 举例说明
以 3.143.143.14 举例:
- 3.143.143.14 为整数 ,所以 sing=0sing = 0sing=0
- 21<3.14<222^1< 3.14<2^221<3.14<22,所以 2(E−127)=212^{(E-127)} = 2^12(E−127)=21 ; E−127=1E-127 =1E−127=1,所以 exponent=128exponent=128exponent=128
- (3.14−21)/(22−21)=0.57(3.14-2^1)/(2^2-2^1) = 0.57(3.14−21)/(22−21)=0.57; 223∗0.57=4781506.562^{23}*0.57 = 4781506.56223∗0.57=4781506.56 四舍五入 fraction=4781506fraction=4781506fraction=4781506
- 所以3.143.143.14的二进制表示为
2. 双精度浮点数
双精度浮点数使用64位表示,格式如下:
- 相较于 单精度浮点数 双精度浮点数 exponentexponentexponent 扩展到 11bit11bit11bit, fractionfractionfraction扩展到 52bit52bit52bit,表示范围更大,精度更高,但原理都是一样的,便不过多赘述。