IEEE754浮点数
IEEE754浮点数
IEEE754标准提供了在计算机内存中以二进制的方式存储十进制浮点数的具体标准
负数
负数在计算机中以补码形式被逐出
补码:正数的二进制取反再加 1
通过补码可以使负数的加减法操作与正数加减法操作相同
浮点数存储方式
float:32位单精度浮点数
double:64位双精度浮点数
32位浮点数存储方式
二进制小数通常采用类科学计数法进行存储
1000.101 -> 1.000101 * 2^3
其中 000101 为尾数
3 为指数

- 符号位 (sign)
- 1 位
- 0表示正数,1表示负数
- 偏移后的指数位 (biased exponent)
- 8 位
- 用于表示[-127, 128]范围内的指数
- 指数位表示 = 实际指数 + 偏移量 (始终为正)
- 偏移量:127
- 尾数位 (fraction)
- 23 位
- 隐藏高位:最高位始终为1,隐藏
- 低位补0:保证填满23位
实例
十进制浮点数: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)
非正常数:
指数位全部填充为1
尾数位全部为0,其对应状态为
根据符号位不同分为
NaN
浮点数取值范围
规格数
指数部分:[-126, 127] (不含全0 和全1)
尾数部分:[1.00…00, 1.11…11](二进制),约为[1, 2)(十进制)
取值范围 =
非规格数
取值范围 =
当尾数取0时,可通过变换符号位表示+0和-0
逐渐溢出
非规格数尾数从0增加至
这种特性在IEEE754中称为逐渐溢出
综合
浮点数值域为
特殊数
超过取值范围:
无法表达(例如虚数):NaN
浮点数精度
数学中的小数是连续的,而计算机中所表达的小数是离散的
随着浮点数数值的增加,IEEE754所能表达的浮点数之间的间隔越来越大,通常来说,32位浮点数能够保持约7位数的有效精度,64位浮点数则为约16位
尽管浮点数最大能表示至约2的128次方,实际在 16777216 之后的整数便由于间隔太大而无法精确存储。