JS中的数值精度问题(一)

使用 IEEE 754 规定的【双精度浮点数】, 8个字节 64位二进制

一、双精度与单精度浮点数的区别

单精度 4个字节 32位二进制 包括符号位1位,阶码8位,尾数23位
双精度 8个字节 64位二进制 包括符号位1位,阶码11位,尾数52位

所存的数值范围不同:
        单精度浮点数的数值范围为-3.4E38~3.4E38,而双精度浮点数可以表示的数字的绝对值范围大约是:-2.23E308 ~ 1.79E308。E表示10的多少次方,如3.4E38指的是3.4乘以10的38次方。

十进制下的位数不同:
        单精度浮点数最多有7位十进制有效数字,如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。
        双精度浮点数可以表示十进制的15或16位有效数字,超出的部分也会自动四舍五入。    

二、8位二进制的的范围

1111 1111 = 无符号 2^8-1 = 255
0111 1111 = 有符号(0代表正数) 最大是127  2^7-1
1000 0000   有符号(1代表负数) 最小是-128

三、64位浮点数存储详解

双精度 8个字节 64位二进制 包括符号位1位,阶码11位,尾数52位:
        第1位:符号位,0表示正数,1表示负数
        第2位到第12位(共11位): 有偏指数部分
        第13位到第64位(共52位):小数部分(即有效数字)

类型划分:11位的指数部分可存储00000000000 ~ 11111111111(十进制范围为0 ~ 2047),取值可分为3种情况:    
        (1)11位指数不为00000000000和11111111111,即在00000000001 ~ 11111111110(1 ~ 2046)范围,这被称为【规格化】。
        (2)指数值为00000000000(0),这被称为【非规格化】
        (3)指数值为11111111111(2047),这是特殊值,有两种情况:
                当52位小数部分f全为0时,若符号位是0,则表示+Infinity(正无穷),若符号位是1,则表示-Infinity(负无穷)
                当52位小数部分f不全为0时,表示NaN(Not a Number)

        (-1)^符号位 * 1.xx…xx * 2^(e-1023)
1023为移码,移码值为 2^(n−1)−1,这里的n表示指数位数,对于64bit的双精度存储,n是11
        2^(11-1) - 1 = 2^10 - 1 = 1023

(1)在规格化中,当指数e最大(前10位为1,11位为0,即2046)且小数f最大(52位全为1)时,能表示出最大正值,为
            1.111...111 * 2^1023
                52个1
            转化成十进制为 1.7976931348623157 * 10^308,则能表示的最小负值为-1.7976931348623157e+308

(2)在非规格化中,当指数e最小(前10位为0,11位为1,即1)且小数f最小(前51位全为0,52位为1)时,能表示出最小正值,为
            0.000...01 * 2^-1022     0.000000⋯000001
            第52位为1                    1073个0
            转为十进制值为5e-324,则最大负值为-5e-324

(3)整数范围(精确整数,无精度丢失)
            当 e - 1023 = 52,即e = 1075,小数f最大(52位全为1)时,能表示出最大安全正整数,为
            1.111...111 * 2^52
                52个1
            转为十进制值为 2^53−1 = 9007199254740991,则能表示的最小安全负整数为-9007199254740991

(4)总结
            [−1.7976931348623157 * 10^308, −5 * 10^−324] ∪ [5* 10^−324, 1.7976931348623157 * 10^308]
            超过1.7976931348623157E+308为Infinity,小于-1.7976931348623157E+308为-Infinity,在(-5E-324,5E-324)之间的数显示为0

参考资料:IEEE-754 64位双精度浮点数存储详解_ieee754双精度浮点数-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值