介绍
单精度浮点数32位,双精度浮点数64位。其中单精度由1位符号位,8位指数位,23位尾数位组成。双精度由1位符号位,11位指数位,52位尾数位组成。
图示
以64位浮点数为例,sign 表示符号位用S 表示,exponent 表示指数位用E 表示,mantissa 表示尾数用M 表示。
浮点数形式
规格化:当指数位E不全为0也不全为1时就是规格化形式浮点数
非规格化:当指数位E全为0时就是非规格化形式浮点数
特殊数值:当指数位E全是1时就是特殊数值,当尾数M全是0时表示无穷大,当符号位S等于1时就是负无穷大。若尾数M不全是0,那么这个数不是一个合法的实数,也就是NaN 。
尾数之前其实还有一个隐藏位。尾数部分其实是小数部分,.xxxxx 是52位二进制小数,如果浮点数形式是规格化 隐藏位就是1,非规格化 就是0。
用s、e、m分别代表符号位、指数位、尾数位的实际值,n代表浮点数,公式为:
n
=
(
?
1
)
s
×
m
×
2
e
(1)
n = (-1)^s \times m \times 2^e \tag{1}
n=(?1)s×m×2e(1)
特殊数值
特殊数值可以表示正负无穷大以及NaN。
符号位S(1) | 指数位E(11) | 尾数位M(52) | 结果 |
---|
0 | 全是1 | 全是0 | Infinity | 1 | 全是1 | 全是0 | -Infinity | 0或1 | 全是1 | 不全是0 | NaN |
规格化
规格化形式的尾数的实际值是1.M。指数E不全为0并且不全为1。
当尾数M全为0时最小,当尾数全为1时最大。所以
1.0
≤
(
m
=
1.
M
)
≤
2
?
2
?
52
(2)
1.0 \leq (m = 1.M) \leq 2 - 2^{-52} \tag{2}
1.0≤(m=1.M)≤2?2?52(2)
提示:当尾数52位全为1时,再加上2^(-52)就等于2。
1.M是一个二进制小数,假设将小数点后移52位,那1.M就是一个二进制整数。所以最大安全整数就是(2 - 2^(-52)) * 2^52,改个符号位就是最小安全整数。
如果超出尾数M的精度范围就不能连续表示了,比如:
let a = 9007199254740991;
a + 1 == a + 2;
因为指数E不全为0也不全为1,所以
1
≤
E
≤
2
11
?
2
(3)
1 \leq E \leq 2^{11} - 2 \tag{3}
1≤E≤211?2(3) 指数的实际值 e 被解释为偏置形式的数,偏移量用bias 表示
{
b
i
a
s
=
2
E
的
宽
度
?
1
?
1
e
=
E
?
b
i
a
s
(4)
\lbrace^{e = E - bias}_{bias = 2^{E的宽度-1} - 1} \tag{4}
{bias=2E的宽度?1?1e=E?bias?(4) 所以偏移量bias = 2^(11 - 1) - 1 = 1023 ,所以 e = E - 1023
n
=
(
?
1
)
S
×
1.
M
×
2
E
?
1023
(5)
n = (-1)^S \times 1.M \times 2^{E - 1023} \tag{5}
n=(?1)S×1.M×2E?1023(5) 不算符号位,n的最大值是 (2 - 2^(-52)) * 2^1023 也就是最大浮点数。
最小值是1.0 * 2^(-1022)。
非规格化
非规格化的尾数是0.M。指数E全为0。
当尾数M全为0时最小,当尾数全为1时最大。所以
0
≤
(
m
=
0.
M
)
≤
1
?
2
?
52
(6)
0 \leq (m = 0.M) \leq 1 - 2^{-52} \tag{6}
0≤(m=0.M)≤1?2?52(6) 指数E全是0,e的偏置形式为
e
=
1
?
b
i
a
s
=
?
1022
(7)
e = 1 - bias = -1022 \tag{7}
e=1?bias=?1022(7)
n
=
(
?
1
)
S
×
0.
M
×
2
?
1022
(8)
n = (-1)^S \times 0.M \times 2^{-1022} \tag{8}
n=(?1)S×0.M×2?1022(8)
当M全是0时,n等于0 。
当M不全是0时,不算符号位,n的最小值是 2^(-52) * 2^(-1022) 也就是最小浮点数。最大值是 (1 - 2^(-52)) * 2^(-1022)。
总结
浮点数形式 | 指数E(11) | 尾数M(52) | 浮点数值 | 范围(不考虑符号位) |
---|
非规格化 | 全是0 | 全是0 | 0 | 0 | 非规格化 | 全是0 | 不全为0 | 公式(8) | 2(-52)*2(-1022) ~ (1 - 2^(-52)) * 2^(-1022) | 规格化 | 不全为0也不全为1 | 任意值 | 公式(5) | 2^(-1022) ~ (2 - 2^(-52)) * 2^1023 | 特殊数值 | 全是1 | 全是0 | 无穷大 | 无穷大 | 特殊数值 | 全是1 | 不全为0 | NaN | NaN |
|