当前位置: 首页 > news >正文

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

一、精度范围,精度最多只能到53个二进制位

        JavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个值。
        国际标准IEEE 754规定,有效数字第一位默认总是1,不保存在64位浮点数之中。也就是说,有效数字总是1.xxxx的形式,其中xxxx的部分(称为尾数或者有效数字,负责数字的精度)保存在64位浮点数(共52位),最长可能为52位。因此(算上第一位不显示的位),JavaScript提供的有效数字为53个二进制位。

        当 e - 1023 = 52,即e = 1075,小数f最大(52位全为1)时,能表示出最大安全正整数,为

            1.111...111 * 2^52
                52个1

        转为十进制值为 2^53−1 = 9007199254740991,则能表示的最小安全负整数为-9007199254740991

        整数区间: -(2^53-1) ~ (2^53-1)
        Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
        // true
        Number.MAX_SAFE_INTEGER === 9007199254740991     // Math.pow(2, 53) // 9007199254740992
        // true

        Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER
        // true
        Number.MIN_SAFE_INTEGER === -9007199254740991

二、数值范围: [−1.7976931348623157 * 10^308, −5 * 10^−324] ∪ [5* 10^−324, 1.7976931348623157 * 10^308]

        最小安全负整数: -(2^53-1) = -9007199254740991
        最大安全正整数: 2^53-1 = 9007199254740991
        最大数值 Number.MAX_VALUE 属性值接近于 1.79E+308。大于 MAX_VALUE 的值代表 "Infinity";
        最小的正值 Number.MIN_VALUE 属性值约为 5e-324,是 JavaScript 里最接近 0 的正值,而不是最小的负值,小于 MIN_VALUE 的值将会转换为0;

        64位浮点数的指数部分的长度是11个二进制位,意味着64位浮点数的指数部分的值最大为2047(2的11次方减1),分出一半表示负数,则JavaScript能够表示的数值范围为2^-1023 到 2^1024,超出这个范围的整数无法表示。

        在规格化中,当指数e最大(前10位为1,11位为0,即2046)且小数f最大(52位全为1)时,能表示出最大正值,为
            1.111...111 * 2^1023
                52个1
        转化成十进制为 1.7976931348623157 * 10^308,则能表示的最小负值为-1.7976931348623157e+308
        
        Number.MAX_VALUE 属性表示在 JavaScript 里所能表示的最大数值。
        如果一个数大于等于2的1024,那么就会发生正同溢出,即JavaScript无法表示这么大的数,这时就会返回Infinity
        1.79E308

        在非规格化中,当指数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

        Number.MIN_VALUE 属性表示在 JavaScript 中所能表示的最小的正值
        绝对值最接近0的最小正值:如果一个数小于等于2的-1075次方(指数部分最小值-1023,再加上小数部分的52位),那么就会发生为“负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0。
        5E-324 === (5 * 10^-324)  Math.pow(2, -1075)

        IEEE754标准用以下形式来表示一个浮点数:
            V = (-1)^s * M * 2^E

            符号:(sign)s决定数是负数(s=1)还是正数(s=0)
            有效数:(significand)M是一个二进制小数
            指数:(exponent)E是2的幂(可能是负数),它的作用是对浮点数加权
 
            64位浮点数: s=1 E=2*11=2048-1=2047

        0.1 十进制表示
        0.0001100110011001100110011001100110011001100110011001101 二进制表示

        [−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博客
        ES6 入门教程
        浅析浮点数精度问题 - 知乎

http://www.lryc.cn/news/170146.html

相关文章:

  • WPF——Control与Template理解
  • 华为HCIA学习(一)
  • 使用jmeter+ant+jenkins+git搭建自动化测试平台
  • C# Winform中在DataGridView中添加Button按钮,操作Button按钮
  • Docker 网络学习
  • django创建web服务器
  • 极光笔记 | 推送服务数据中心选择:合规性与传输效率的双重考量
  • Python灰帽编程——初识Python上
  • OLED透明屏交互技术:开创未来科技的新篇章
  • 揭秘Spring Boot内嵌Tomcat原理
  • 分类散点图 stripplot() 加辅助线axhline() 多图合一
  • 一文告诉你为什么时序场景下 TDengine 数据订阅比 Kafka 好
  • reg与wire的用法,证明reg可以在右边,wire型在左边,来作组合逻辑处理。
  • Studio One6.2简体中文免费最新版本宿主软件
  • 算法刷题 week2
  • 子网的划分
  • Docker安装与卸载
  • 【Davinci开发】:开发过程问题记录及总结
  • 数据结构——排序算法——冒泡排序
  • vscode使用
  • python经典百题之求前!的和
  • C语言入门Day_22 初识指针
  • 【面试必刷TOP101】删除链表的倒数第n个节点 两个链表的第一个公共结点
  • 手刻 Deep Learning -第壹章 -PyTorch教学-激励函数与感知机入门(上)
  • 物理内存分配
  • RFID产线自动化升级改造管理方案
  • 全量数据采集:不同网站的方法与挑战
  • Redis——渐进式遍历和数据库管理命令
  • 如何打造可视化警务巡防通信解决方案
  • ATF(TF-A) SPMC威胁模型-安全检测与评估