IEEE754浮点数

IEEE754浮点数

参考

IEEE754标准提供了在计算机内存中以二进制的方式存储十进制浮点数的具体标准

负数

负数在计算机中以补码形式被逐出
补码:正数的二进制取反再加 1

通过补码可以使负数的加减法操作与正数加减法操作相同

浮点数存储方式

float:32位单精度浮点数
double:64位双精度浮点数

32位浮点数存储方式

二进制小数通常采用类科学计数法进行存储
1000.101 -> 1.000101 * 2^3
其中 000101尾数
3指数

实例

十进制浮点数:20.5
二进制浮点数:10100.1 = 1.01001 * 2 ^ 4

符号位:0
偏移后指数位:4 + 127 = 132 = 1000 0011
尾数位:0100 1000 0000 0000 000
最终表示:0 1000 0011 0100 1000 0000 0000 000

64 位浮点数存储方式

64 位的尾数部分为 52 位,指数部分为 8 位
64位偏移量:1023

浮点数分类

规格数 (normal number)

尾数位隐藏最高位为1的常规浮点数
无法表示0

非规格数 (subnormal number)

尾数位隐藏最高位为0的非常规数
指数位全部填充为0,对应实际指数固定为-126

特殊数 (non-number)

非正常数:± 或 NaN
指数位全部填充为1

尾数位全部为0,其对应状态为2128
根据符号位不同分为+

NaN

符号位可正可负
尾数位不全为0

浮点数取值范围

规格数

指数部分:[-126, 127] (不含全0 和全1)
尾数部分:[1.00…00, 1.11…11](二进制),约为[1, 2)(十进制)

取值范围 = ±2 = ±[1,2)2[126,127]

非规格数

取值范围 = ±2 = ±[0,1)2126
当尾数取0时,可通过变换符号位表示+0和-0

逐渐溢出

非规格数尾数从0增加至(1223)然后衔接至规格数最小值1
这种特性在IEEE754中称为逐渐溢出

综合

浮点数值域为(22127,22127)

特殊数

超过取值范围:
无法表达(例如虚数):NaN

浮点数精度

数学中的小数是连续的,而计算机中所表达的小数是离散的
随着浮点数数值的增加,IEEE754所能表达的浮点数之间的间隔越来越大,通常来说,32位浮点数能够保持约7位数的有效精度,64位浮点数则为约16位

尽管浮点数最大能表示至约2的128次方,实际在 16777216 之后的整数便由于间隔太大而无法精确存储。