IEEE 754
IEEE 754
IEEE 754标准定义了浮点数的表示方法,其中双精度浮点数(Double Precision Floating Point)是该标准的一部分,用于表示更高精度的浮点数。双精度浮点数在计算机科学和工程领域广泛应用。下面详细介绍IEEE 754标准的双精度浮点数类型。
双精度浮点数
双精度浮点数在IEEE 754标准中占用64位(8字节),其表示方法包括三个部分:符号位、指数位和尾数位(也称为小数或有效位)。这64位的分配如下:
- 1位符号位(S):表示数的正负。
- 11位指数位(E):表示数的指数部分。
- 52位尾数位(M):表示数的尾数部分,也称为有效位数。
整体表示格式如下:
S | EEEEEEEEEEE | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
各部分详细解释
- 符号位(S):
- 0表示正数。
- 1表示负数。
- 指数位(E):
- 双精度浮点数使用偏移量为1023的移码表示法(也称为偏置码,Bias)。
- 实际指数值等于存储的指数值减去偏移量1023。
- 存储的指数范围为0到2047,但实际有效范围为1到2046(0和2047用于特殊值)。
- 指数值为0表示非规格化数,指数值为2047表示无穷大或NaN(非数值)。
- 尾数位(M):
- 尾数位表示浮点数的小数部分,范围在
[1, 2)
之间。 - IEEE 754标准采用隐含的1位,即实际表示的数是
1.M
(隐含的1位不存储在尾数位中)。 - 对于非规格化数,尾数位没有隐含的1位,表示形式为
0.M
。
数值计算
给定一个双精度浮点数,通过符号位、指数位和尾数位计算其实际数值:
(-1)^S * 2^(E-1023) * 1.M
特殊值 IEEE 754标准规定了一些特殊值:
- 正零和负零:
- 符号位分别为0和1,指数位和尾数位均为0。
- 正无穷大和负无穷大:
- 符号位分别为0和1,指数位为2047,尾数位为0。
- NaN(非数值):
- 指数位为2047,尾数位非零。
- 非规格化数:
- 指数位为0,尾数位非零,表示非常小的数。
优点和局限性
优点
- 高精度和宽范围,适用于需要精确数值计算的领域,如科学计算和工程计算。
- 标准化的表示方法,确保不同系统之间的数据兼容性。
局限性
- 浮点数运算存在舍入误差和精度问题。
- 需要更多的存储空间和计算资源。
总结来说,IEEE 754双精度浮点数标准通过规定符号位、指数位和尾数位的表示方法,提供了一种高效且标准化的数值表示方式,广泛应用于需要高精度和大范围数值计算的场合。
精度丢失
IEEE 754双精度浮点数占用64位,其中包括1位符号位、11位指数位和52位尾数位。这种表示法允许表示非常大的和非常小的数,但在表示某些数值时会出现精度丢失问题。
- 有限的尾数位
- 尾数位只有52位,这意味着它只能精确表示52位二进制数(大约15-17位十进制数)。超出这个范围的数值将被近似表示。
- 当需要表示更多位数的数时,超过52位部分的数值将被截断或四舍五入,导致精度丢失。
- 非整数的表示
- 浮点数采用二进制表示,一些十进制的非整数在二进制中无法精确表示,比如0.1。在二进制中,0.1是一个无限循环的小数,因此只能近似表示。
- 这种近似表示会导致在数学运算中累积误差。
示例
- 非整数表示不准确
在二进制中,0.1和0.2无法精确表示,所以它们的和也无法精确表示。
console.log(0.1 + 0.2); // 输出 0.30000000000000004
- 大数运算丢失精度
由于9007199254740991(即2^53 - 1)是JavaScript中最大的安全整数,超出这个范围的整数运算将不再精确。
console.log(9007199254740991 + 1); // 输出 9007199254740992
console.log(9007199254740991 + 2); // 输出 9007199254740992
总结
float类型遵循IEEE 754双精度浮点数标准,这会导致在表示和计算某些数值时出现精度丢失的问题。这主要是由于有限的尾数位和某些十进制数在二进制中无法精确表示。