资讯专栏INFORMATION COLUMN

JS-Number—了解IEEE双精度浮点数

shixinzhang / 2449人阅读

摘要:一复习进制转进制整数部分除取余,逆序小数部分乘取整,正序在线工具二了解双精度浮点数规范通过进制的科学计数法存储。最终可表示为图片来源其中,,都是实际存储科学计数法的值。

一、复习10进制转2进制

1)整数部分:除2取余,逆序
2)小数部分:乘2取整,正序
在线工具

二、了解IEEE 754双精度浮点数规范 1) 通过2进制的科学计数法存储。

和10进制的科学计数法类似,二进制的科学技术法格式为1.xxx*2^N。其中需要留意下二进制科学计数法的整数部分都是1,所以在存储时省略整数部分1。

2) 格式:符号位+指数位+尾数位

符号位S:第 1 位是正负数符号位(sign),0代表正数,1代表负数

指数位E:中间的 11 位存储指数(exponent),用来表示次方数
科学计数法中指数E是可以为负数的,在表示负的指数时IEEE754标准引入了一个偏移量1023,在存储指数时加上该偏移量把负数E转成正数。这就导致11位的指数能够表示指数的范围是[-1023, 1024]。

尾数位M:最后的 52 位是尾数(mantissa),超出的部分自动进一舍零,没有填满的部分自动补0
如10进制数400.12,用10进制科学计数法表示为:4.0012*10^2,。其中"0012"就是尾数部分。

最终可表示为(图片来源):

其中S,E,M都是实际存储科学计数法的值。
如10进制4.5转成2进制为:

// Step1 转成二进制
100.1
// Step2 转成二进制科学计数
1.001*2^2
S = 0
E = 2 + 1023 = 2015
M = 001 // 整数1被省略了

形象的查看存储情况,可参考这里

3) 有限集合

IEEE754能表示的实数数量是有限的,假设MAX_VALUE,MIN_VALUE分别表示其表示的最大正数和最小正数,那有限集合可表示为:

[-MAX_VALUE, -MIN_VALUE] U [MIN_VALUE, -MAX_VALUE]
几个有趣的问题 1) 0.1 + 0.2 !== 0.3

0.1,0.2和0.3在转成二进制时都是无限循环的,在存储时会失去精度,0.1+0.2在运算时也会失去精度,导致结果不等于0.3。

2) 给一个数字加上一个非0的增量还等于本身这个数字
1 + Number.MIN_VALUE/2 === 1

这个增量如果小于JS能表示的最小浮点数就会视为0,加上这样的数等于加上0。

3) JS最大整数为啥是2^53-1而不是2^52-1

尾数占用52个bit,再加速省略的那个bit(见2.1)正好53个bit。

4)JS可以精确的表示哪些小数呢

小数部分是这种格式的都可以精确表示。

1/Math.pow(2, N), 其中N是(0, 1024)区间的整数。

如分数1/2,1/4, 1/8。

参考

抓住数据的小尾巴 - JS浮点数陷阱及解法

该死的IEEE-754浮点数,说「约」就「约」,你的底线呢?以JS的名义来好好查查你

IEEE 754 计算器

IEEE 754 二进制表示

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107293.html

相关文章

  • 探寻 JavaScript 精度问题以及解决方案

    摘要:推导为何等于在中所有数值都以标准的双精度浮点数进行存储的。先来了解下标准下的双精度浮点数。精度位总共是,因为用科学计数法表示,所以首位固定的就没有占用空间。验证完成的最大安全数是如何来的根据双精度浮点数的构成,精度位数是。 阅读完本文可以了解到 0.1 + 0.2 为什么等于 0.30000000000000004 以及 JavaScript 中最大安全数是如何来的。 十进制小数转为二...

    YanceyOfficial 评论0 收藏0
  • 该死的IEEE-754点数,说「约」就「约」,你的底线呢?以JS的名义来好好查查你

    摘要:而的浮点数设置的偏移值是,因为指数域表现为一个非负数,位,所以,实际的,所以。这是因为它们在转为二进制时要舍入部分的不同可能造成的不同舍 IEEE 754 表示:你尽管抓狂、骂娘,但你能完全避开我,算我输。 一、IEEE-754浮点数捅出的那些娄子 首先我们还是来看几个简单的问题,能说出每一个问题的细节的话就可以跳过了,而如果只能泛泛说一句因为IEEE754浮点数精度问题,那么下文还是...

    gaosboy 评论0 收藏0
  • IEEE754 点数格式 与 Javascript number 的特性

    摘要:类型使用的就是标准中的双精度浮点数。数字的许多特性都依赖于此标准,例如令人费解的不等于这篇文章介绍标准中双精度浮点数二进制储存格式,并由此推出中数字的一些特性。 Javascript 作为一门动态语言,其数字类型只有 number 一种。 nubmer 类型使用的就是 IEEE754 标准中的 双精度浮点数。Javascript 数字的许多特性都依赖于此标准,例如令人费解的 0.1+0...

    BigTomato 评论0 收藏0
  • 由parseInt 引发的问题---想到点运算精度丢失---看透js number 的 encod

    摘要:如题先陈述下问题背景偶尔测测自己写的计算器,随便输入玩嘛,然后发生下面诡异的事情当我从一个输入到十个的时候,过程显示都是正确的,像这样继续输入一个的时候,然后就这个样子了什么原因呢看了下自己的代码,代码重要部分长这样的这里用了一下强制转化为 如题 先陈述下问题背景 偶尔测测自己写的计算器,随便输入玩嘛,然后发生下面诡异的事情:当我从一个 1 输入到十个 1 的时候,过程显示都是正确的...

    hightopo 评论0 收藏0
  • 数字在JavaScript中是如何编译的

    摘要:数字数字都是浮点数,按照标准进行存储。因此,只有偶数可以在范围内表示。但只有超过指数的上限才称为中的溢出。结论在这篇博文中,我们研究了如何将其浮点数转换为位。 JavaScript中的所有数字都是浮点数。这篇博客文章解释了这些浮点数如何在64位二进制内部表示。由于特别考虑,本文中的数字将用整数表示,以便在阅读本文后,您将了解在以下交互中会发生什么: (译者注:浮点数并不一定等于小数,定...

    Moxmi 评论0 收藏0

发表评论

0条评论

shixinzhang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<