【JS迷你书】Number类型二进制表示法
问你一个问题:JS
中 Number
类型数据总共有多少个?
这有答案吗?
《Ecma-262 Edition 5.1》给出的答案是:18437736874454810627,即 。
那么,具体是怎么算出来的??
本文主要解决这个问题。
规范上说,Number
类型使用的是《 IEEE二进制浮点数算术标准(IEEE 754)》的双精度 64 位格式。
其核心问题:是怎么用 64 个比特位,来表示一个具体浮点类型数值?
《IEEE 754.pdf》把这 64 位比特分成 3 部分:
其中,s
表示符号位,占 1 比特;e
表示指数位,占 11 比特;f
表示分数位,占 52 比特。
规范里详细地给出了各种情况所对应的值:
上述分类是符合 MECE 原则的,不重复且不遗漏。
其中 e
占 11 位,因此该部分能表示的数字范围是 0 至 2047,即,0 至。分类首先标准就是看 e
是否位于边界。
前两条是指当 e
部分都填充二进制 1 时,即当指数部分为最大值时,表示 NaN
和正负 Infinity
这两种情况。
具体来说,第一种,当小数部分同时不为零时,此时表示 NaN
。JS
中的字面量 NaN
,正是对应这种情况,另外要求 NaN
始终不能等于自身。
第二种,而当 f
部分为 0 时,根据符号位的正负,来表示相应的正负无穷。
第三条是指当 e
在介于最小值和最大值之间的情形。此时被称为规范化数字,有别于下面的第四条。这里值的确定方式是 。此时要注意 指的是二进制小数。
举个例子,假设某个数字的 64 位比特表示如下: 1|10000000001|110000...
,此时 s
是 1, e
是 ,即 1025。那么该数据对应的值 v
是: 而二进制小数 其值是,即 1.75
。因此该表示是 -7。
第四条是指非规范化数字情形。此时数字已经非常小了。注意这里是二进制小数是 不同于第三条里的 。最后一类是正负 0 的情形。
我们已经把规范过了一遍,现在,我们来算算开头的问题:Number
类型共有多少个值?
从上述分类中可以看出:后三类是正常值,前两类总共有 种可能(排列组合原理,s
部分为 2047,因此相应的只有一种可能),这么多种可能,却在 JS
中只表示 NaN
、+Infinity
、-Infinity
这 3 个值。因此总数 。
至此,本文接近尾声了。
最后提醒一下,阅读《Ecma-262 Edition 5.1》8.5节不要犯迷糊:
The 18437736874454810622 (that is, ) finite nonzero values are of two kinds: 18428729675200069632 (that is, )of them are normalised, having the form
where s is +1 or −1, m is a positive integer less than but not less than , and e is an integer ranging from −1074 to 971, inclusive.
The remaining 9007199254740990 (that is, ) values are denormalised, having the formwhere s is +1 or −1, m is a positive integer less than , and e is −1074.
其中提到了 e
是从 -1070 到 971,这两个数字怎么来的?其实它与《IEEE 754.pdf》说的是同一回事,比如规范化情形,只是从指数部分里拿出了 放到了 m
里面。 m
等价于。
本文完。
《JavaScript 迷你书》传送门,全面夯实基础
掘金收藏
【JS迷你书】Number类型二进制表示法相关推荐
- 【JS迷你书】我的 JavaScript 世界观
我们都生活在主观的世界里,但真实世界却是个复杂系统. 对于一个非线性系统来说,用任何线性思维去理解都会所偏颇. 用<失控>的观点来说,对于非线性系统,你只有运行起来才知道它具体会是什么. ...
- JS 最新数据基本类型:BigInt
原文:https://www.smashingmagazine.com/2019/07/essential-guide-javascript-newest-data-type-bigint/ 译者:前 ...
- 深入了解JS的Number类型
深入了解 Number 类型 Number 类型作为 JS 的基本数据类型之一,被应用在程序中的各种场景,其重要性就如数字对于我们日常生活. 下面就让我们来一起深入了解下,为以后的"策马奔腾 ...
- JS Number类型的数值转换
js有5种基本数据类型: undefined, Null, Boolean,Number, String(, Symbol).还有一种复杂类型数据: Object. Number() Number类型 ...
- Number类型及方法(js)
JavaScript的基本包装类型之Number类型:代表数值数据类型和提供数值常数的对象. Number的方法: 1. toString(): 把数字转换为字符串,使用指定的基数,括 ...
- Js强制类型转换——String类型 / Number类型/Boolean类型
String类型 / Number类型 强制类型转换---String 强制类型转换---Number 强制类型转换---Boolean JS有六种数据类型,其中前五为基本数据类型: 类型 名称 St ...
- 后端 Long类型,超过 js 的number类型最大值的解决办法
先看问题: 数据库 id 为 Bigint 类型: 通过后端逻辑取值返回给前端: JS 的number类型有个最大值(安全值).即2的53次方,为9007199254740992(16位).如果超过这 ...
- js正则贪婪模式_JavaScript正则表达式迷你书之贪婪模式-学习笔记
这篇文章主要介绍了JavaScript正则表达式迷你书之贪婪模式-学习笔记,需要的朋友可以参考下 贪婪模式: 在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如: ...
- React.js 小书 Lesson24 - PropTypes 和组件参数验证
作者:胡子大哈 原文链接: http://huziketang.com/books/react/lesson24 转载请注明出处,保留原文链接和作者信息. 我们来了到了一个非常尴尬的章节,很多初学的朋 ...
最新文章
- python官网下载手机版步骤-Python
- Visial Studio 2019提示:namespace std 没有成员 max 的解决方法
- rename 批量修改文件名简单用法
- mysql 对已有表分区_mysql怎么对先有表进行分区
- C++入门经典-例2.13-左移运算
- php 隐藏 div 代码,在HTML里用CSS隐藏div的方法
- 实战丨基于接口的银行系统自动化测试实践
- matlab中输出汉字的函数,matlab中的输出显示函数
- JavaScript入门基础
- mysql 自定义插件调试
- php excel导入读取公式本身不计算,使用PHPExcel读取Excel文件时忽略计算值
- 解决opencart配置Gmail邮箱收不到来信
- 2.4 大电路静态工作点的稳定
- 渗透测试资产指纹识别工具
- 镭神16线激光雷达使用
- /boot空间不足的解决办法
- ei检索计算机科学与应用,国内EI检索的期刊有哪些?(计算机、信息方向) - 论文投稿 - 小木虫 - 学术 科研 互动社区...
- 数据结构之线性表及C语言实现
- 数值法求解最优控制问题(二)——打靶法
- 哈巴狗可以分为哪几种?
热门文章
- (两百五十六)学习perfetto(一)
- Windows网速显示软件TrafficMonitor
- 项目管理PV、EV、AC、BAC、EAC、ETC等计算
- 自定义变量的一个有趣案例
- 数据治理之敏感数据探查
- 改变水平线hr的颜色
- 目标检测的Tricks | 【Trick13】使用kmeans与遗传算法聚类anchor
- 蓝牙耳机无法打开计算机,电脑搜不到蓝牙耳机怎么回事_电脑搜不到蓝牙耳机的处理方法【图文】...
- 基于STC98C52RD+的51MCU学习流水账--->串口通讯学习(汇编版)
- 期权程序化交易接口有哪些?