IEEE754 double 类型步长规律,从1.0的二进制表示、紧挨着1.0略大和略小的数开始归纳
1. double 类型 1.0 的二进制表示
在 IEEE 754 双精度(double)浮点数格式(64 位)中,给定的二进制表示 0011111111110000000000000000000000000000000000000000000000000000
对应于 1.0。其结构如下:
符号位(1 位):0
(正数)
指数位(11 位):01111111111
(十进制值 1023,实际指数为 1023 - 1023 = 0)
尾数位(52 位):0000000000000000000000000000000000000000000000000000
(隐含前导 1,因此尾数值为 1.0)
2.0 比1.0 略大的那个 double 数
在浮点数表示中,相邻的可表示数是通过增加尾数的最小有效位(LSB)得到的。尾数有 52 位,因此最小可表示的增量(机器 epsilon)为 。由于当前指数为 0,步长为
.
2. 紧挨着比 1.0 大的数的二进制表示
2.1. 略大的数
要得到比 1.0 大的最小数,只需将尾数的最低有效位(LSB)从 0 改为 1,同时保持符号位和指数位不变:
符号位:0
指数位:01111111111
(不变)
尾数位:原为全 0
,现在改为 0000000000000000000000000000000000000000000000000001
(前 51 位为 0,最后一位为 1)
完整的 64 位二进制表示为:
0011111111110000000000000000000000000000000000000000000000000001
2.2. 比 1.0 大出了多少
这个新值对应于 ,因此它比 1.0 大
。
精确值:
十进制近似值:约
2.3. 验证
新数的计算:
指数域 01111111111
= 1023,实际指数 。
尾数域 0000000000000000000000000000000000000000000000000001
对应尾数值 (因为最低位为 1,其余为 0)。
隐含前导 1,因此实际尾数为
整体值:
差值:
这个值确实是紧挨着 1.0 的下一个可表示浮点数,因为尾数增加最小单位不会导致指数变化(无溢出)。
3. 比1.0 略小的数
3.1. 重复表示1.0,免翻页
在 IEEE 754 双精度浮点数格式(64 位)中,1.0 的二进制表示为:
0 01111111111 0000000000000000000000000000000000000000000000000000
符号位:0
(正数)
指数位:01111111111
(1023,实际指数为 0)
尾数位:全 0
(隐含前导 1,尾数值为 1.0)
3.2. 紧挨着 1.0 但比 1.0 小的数的二进制表示
比 1.0 小的最大可表示数位于指数为 -1 的区间(即 )。其表示如下:
符号位:0
(正数)
指数位:01111111110
(1022,实际指数为 -1)
尾数位:全 1
(52 位全 1,表示最大尾数)
完整 64 位二进制表示为:
0 01111111110 1111111111111111111111111111111111111111111111111111
3.3. 该数的值计算
尾数值:隐含前导 1 + 小数部分,小数部分为 (全 1 的 52 位二进制值)。
尾数值 =
实际指数:-1
整体值:
3.4. 比 1.0 小了多少
差值:
精确值:
十进制近似值:
3.5. 为什么是这个数
在 [0.5, 1)
区间(指数为 -1),浮点数的步长为 (因为指数为 -1 时,尾数最小单位
对应值
;
该区间最大值是 ,紧邻 1.0 的下方,且无其他可表示数位于它与 1.0 之间;
1.0 是下一个区间 [1, 2)
的最小值,其与 的差正好是区间步长
。
4.0 步长规律
从 到
之间的步长为
; (0.5, 1.0]
从 到
之间的步长为
; (1.0, 2.0]
从 到
之间的步长为
; (2.0, 4.0]
以此类推 ....
不过需要注意的是,我们仅仅在 正规浮点数的一个区间上寻找这里的规律。比如,亚正规浮点数的步长是等长的,可做进一步分析。