浮点标准
类型 | m s m_s ms | 阶码 | 尾数 | 偏置值 |
---|---|---|---|---|
float (32-bit) | 1 | 8 | 23 | 127(7F) |
double(64-bit) | 1 | 11 | 52 | 1023(3FFF) |
浮点数结构:
符号位(1-bit) | 阶码(8-bit) | 尾数(23-bit) |
---|---|---|
m s m_s ms | E | M |
此处阶码是用移码表示
浮点数并不向整数那样表示,而是用幂2的方式去表示。比如:
( 1.000000 ) 2 ∗ 2 − 1 = ( 0.5 ) 10 (1.000000)_2*2^{-1}=(0.5)_{10} (1.000000)2∗2−1=(0.5)10
当然真实的计算不是这么简单的。
真实的计算是这样的:
- 有效数字
比如 0.321 = > 3.21 ∗ 1 0 − 1 0.321 => 3.21 * 10^{-1} 0.321=>3.21∗10−1,在二进制中也是一样,比如 ( 0.0101 ) 2 = > ( 1.01 ) 2 ∗ 2 − 2 (0.0101)_2 => (1.01)_2 * 2^{-2} (0.0101)2=>(1.01)2∗2−2。浮点数的表示也是这样,存储的是经过有效数字处理的小数。
M(尾数)存储的都是小数点后面的数。比如尾数是 ( 0100 ) 2 (0100)_2 (0100)2,实际上是 ( 1.0100 ) 2 (1.0100)_2 (1.0100)2
- 幂表示
跟int值存储格式是不一样的。
按照IEEE 754标准,32-bit浮点数是这样计算的:
( − 1 ) m s ∗ 1. M ∗ 2 E − 127 (-1)^{m_s} * 1.M*2^{E-127} (−1)ms∗1.M∗2E−127
其中 E ∈ [ 1 , 254 ] E \in [1,254] E∈[1,254]