javascript浮点数介绍

本文详细介绍了JavaScript中的64位浮点数表示,包括符号位、指数位和尾数位的组成,以及规格化和非规格化形式。讲解了特殊数值如无穷大和NaN的表示,并探讨了最大安全整数和最小浮点数的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

单精度浮点数32位,双精度浮点数64位。其中单精度由1位符号位,8位指数位,23位尾数位组成。双精度由1位符号位,11位指数位,52位尾数位组成。

图示

以64位浮点数为例,sign表示符号位用S表示,exponent表示指数位用E表示,mantissa表示尾数用M表示。

浮点数

浮点数形式

规格化:当指数位E不全为0也不全为1时就是规格化形式浮点数

非规格化:当指数位E全为0时就是非规格化形式浮点数

特殊数值:当指数位E全是1时就是特殊数值,当尾数M全是0时表示无穷大,当符号位S等于1时就是负无穷大。若尾数M不全是0,那么这个数不是一个合法的实数,也就是NaN

尾数之前其实还有一个隐藏位。尾数部分其实是小数部分,.xxxxx是52位二进制小数,如果浮点数形式是规格化隐藏位就是1,非规格化就是0。

用s、e、m分别代表符号位、指数位、尾数位的实际值,n代表浮点数,公式为:
n = ( − 1 ) s × m × 2 e (1) n = (-1)^s \times m \times 2^e \tag{1} n=(1)s×m×2e(1)

特殊数值

特殊数值可以表示正负无穷大以及NaN

符号位S(1)指数位E(11)尾数位M(52)结果
0全是1全是0Infinity
1全是1全是0-Infinity
0或1全是1不全是0NaN

规格化

规格化形式的尾数的实际值是1.M。指数E不全为0并且不全为1。

当尾数M全为0时最小,当尾数全为1时最大。所以
1.0 ≤ ( m = 1. M ) ≤ 2 − 2 − 52 (2) 1.0 \leq (m = 1.M) \leq 2 - 2^{-52} \tag{2} 1.0(m=1.M)2252(2)

提示:当尾数52位全为1时,再加上2^(-52)就等于2。

1.M是一个二进制小数,假设将小数点后移52位,那1.M就是一个二进制整数。所以最大安全整数就是(2 - 2^(-52)) * 2^52,改个符号位就是最小安全整数。

如果超出尾数M的精度范围就不能连续表示了,比如:

let a = 9007199254740991;  // 最大安全整数
a + 1 == a + 2;  // true

因为指数E不全为0也不全为1,所以
1 ≤ E ≤ 2 11 − 2 (3) 1 \leq E \leq 2^{11} - 2 \tag{3} 1E2112(3)
指数的实际值 e 被解释为偏置形式的数,偏移量用bias表示
{ b i a s = 2 E 的 宽 度 − 1 − 1 e = E − b i a s (4) \lbrace^{e = E - bias}_{bias = 2^{E的宽度-1} - 1} \tag{4} {bias=2E11e=Ebias(4)
所以偏移量bias = 2^(11 - 1) - 1 = 1023,所以 e = E - 1023
n = ( − 1 ) S × 1. M × 2 E − 1023 (5) n = (-1)^S \times 1.M \times 2^{E - 1023} \tag{5} n=(1)S×1.M×2E1023(5)
不算符号位,n的最大值是 (2 - 2^(-52)) * 2^1023 也就是最大浮点数

最小值是1.0 * 2^(-1022)

非规格化

非规格化的尾数是0.M。指数E全为0。

当尾数M全为0时最小,当尾数全为1时最大。所以
0 ≤ ( m = 0. M ) ≤ 1 − 2 − 52 (6) 0 \leq (m = 0.M) \leq 1 - 2^{-52} \tag{6} 0(m=0.M)1252(6)
指数E全是0,e的偏置形式为
e = 1 − b i a s = − 1022 (7) e = 1 - bias = -1022 \tag{7} e=1bias=1022(7)

n = ( − 1 ) S × 0. M × 2 − 1022 (8) n = (-1)^S \times 0.M \times 2^{-1022} \tag{8} n=(1)S×0.M×21022(8)

当M全是0时,n等于0

当M不全是0时,不算符号位,n的最小值是 2^(-52) * 2^(-1022) 也就是最小浮点数。最大值是 (1 - 2^(-52)) * 2^(-1022)

总结

浮点数形式指数E(11)尾数M(52)浮点数值范围(不考虑符号位)
非规格化全是0全是000
非规格化全是0不全为0公式(8)2^(-52) * 2^(-1022) ~ (1 - 2^(-52)) * 2^(-1022)
规格化不全为0也不全为1任意值公式(5)2^(-1022) ~ (2 - 2^(-52)) * 2^1023
特殊数值全是1全是0无穷大无穷大
特殊数值全是1不全为0NaNNaN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值