浮点数组成
以单精度浮点数(32位)为例说明:
十进制浮点数组成:
十进制基数(base)为10
二进制浮点数组成:
二进制基数(base)为2
以IEEE 754标准表示十进制数: ( 7.625 ) 10 (7.625)_{10} (7.625)10,先将其转成二进制表示: ( 111.101 ) 2 = 1.11101 ∗ 2 2 = 2 2 ∗ ( 1 + 0.11101 ) (111.101)_{2}=1.11101*2^{2}=2^{2}*(1+0.11101) (111.101)2=1.11101∗22=22∗(1+0.11101)
将以上二进制以IEEE 754标准存入内存中如下:
浮点数 二进制小数转十进制小数公式: s i g n ∗ 2 E ∗ ( 1 + m a n t i s s a ) sign*2^{E}*(1+mantissa) sign∗2E∗(1+mantissa) 这里的 E E E是实际指数(下面会说明 E E E的计算)而不是存储在内存中的指数。
IEEE 754 浮点数概述
IEEE 754 规范化浮点数
sign规定
0为正
1为负
exponent规定
指数部分有正有负,因此IEEE 754标准中采用有偏指数(The Biased exponent)表示。这意味着存储在内存中的指数部分 e e e并不是实际的指数 E E E。存储在内存中的指数 e e e为实际指数 E E E加上偏移常数(Bias)。
对于单精度浮点数(32位)为例,实际指数 E E E和存储的指数 e e e之间的关系如下:
E = e − 127 E=e-127 E=e−127
这里,127是偏移常数(Bias)。偏移常数计算采用: 2 n − 1 − 1 2^{n-1}-1 2n−1−1,这里的 n n n为存储指数的bit位数。对于单精度浮点数,指数部分占8位(即 n = 8 n=8 n=8),因此偏移常数是 2 8 − 1 − 1 = 127 2^{8-1}-1=127 28−1−1=127
mantissa规定
通过移位操作将小数点前的值固定为1。
mantissa为23位,但是小数点前有固定为1的一位,因此尾数部分比实际多一位,共24位(significand)
IEEE 754 非规范化浮点数
非规范化浮点数表示0和接近0的值
exponent规定
exponent部分全为0。
偏移值比规范化的偏移值小1。即: 2 n − 1 − 2 2^{n-1}-2 2n−1−2,以单精度浮点数为例 2 8 − 1 − 2 = 126 2^{8-1}-2=126 28−1−2=126表示0。指数位全为0,则是-126。
mantissa规定
规范化浮点数表示,mantissa部分有一个省略的前导1
非规范化浮点数表示,当指数位全为0时,mantissa部分没有被省略的前导1
特殊值
Infinity值
NaN(Not a Number)值
好用的几个工具
- base convert
- float toy