(数据类型-Number的浮点型)JavaScript权威指南笔记4.1

来源:互联网 发布:淘宝淘抢购在哪里打开? 编辑:程序博客网 时间:2024/06/07 02:21

数字(number)的描述

javascript不区别整型数值和浮点型数值。
javascript采用IEEE 754标准定义的64位浮点格式表示数字。
数字表示最大值是:2^1024约等于1.7976931348623157*10^308
最小值是:2^(-52)*2^(-1022)约等于5*10^(-324)。
本节给的最大值和最小值是一个大约值。
这个范围是怎么得来的呢?以下做个简单说明。

IEEE 754标准定义的64位浮点存储格式

目的
了解浮点数存储结构和浮点数的表示范围是为了避免编写代码时,计算结果溢出造成内存泄漏。

计算机中:
(+0)=0.000…
(- 0)=1.000…

这里写图片描述

s:占1位,浮点数的符号位。
E:占11位,浮点数的指数或称为价码。
h:不占位,隐藏位。值是1或0。
f :占52位,小数位。
s(1)+E(11)+h(0)+f(52)=64位

下图为ieee754文档内容,其中53表示有1位s和52位f
这里写图片描述

64位浮点数二进制公式

V=(-1)^s*M*R^e=(-1)^s*1.f*R^e
R为基数,这里的表达式是二进制,值为2。
M=h+0.f,即 M=1+0.f 或 M=0.0+0.f。M为1时称为规范化格式,M值为0时称为非规范化格式。

V结果可表示:无穷大,无穷小,NaN,sNaN,0.f*2^emin,1.f*2^e,0。
ieee754文档的截图:
这里写图片描述
另一个文档描述的图比较直观,见下图(出处点击这里):
这里写图片描述

当emin < e < emax时,V的值为1.f*2^e,为浮点型规范化表示,隐藏位h的值为1。
当e=emin-1和f为非0值时,为浮点型非规范化表示,隐藏位的值为0。
NaN表示不是一个数。

关于E值的说明

E值用移码来存储,所以真值e需要加一个修正值才等于E值,64位浮点数的修正值是1023,即E=e+1023。计算机中用补码来将负数和值一起编码,所以11位的1023是[-1023]补=111 1111 1111=100 0000 0001。

E占用11位,为无符号值,所以E值表示的范围是0到2^11-1,即0到2047。真值e最大值=E最大值-1023=1024。真值e的最小值=E最小值-1023=-1023。真值e的表示范围是 -1023到1024。

E值为全1和全0时有特殊用途。用来结合f值表示浮点数结果的其他情况(见前面的表格图:TABLE D-2 IEEE 754 Special Values)。

E值最大值,即为全1时,E值=2047,真值e=1024。
e=E-1023=2047-1023=111 1111 1111[移] + 100 0000 0001[补] =1100 0000 0000,进位1超过11位,丢弃,11位的值为“100 0000 0000”。“100 0000 0000”表示的正数时真值为1024,表示负数时为-2048。因为E-1023>0,结果为正数,所以e值为1024而不是-2048。

E值最小值,即为全0时,E值=0,真值e=-1023。
e=E-1023=0-1023=000 0000 0000 + 100 0000 0001 = 100 0000 0001,11位的值为“100 0000 0000”。“100 0000 0001”表示的正数时真值为1025,表示负数时为-1023。因为E-1023<0,结果为负数,所以e值为-1023,而不是1025。

真值e的表示范围是emin到emax(注意emin和emax是真值),见下图:
这里写图片描述

e最小值=-1023=emin-1=-1022-1,即emin=-1022。
e最大值=1024=emax+1=1023+1,即emax=1023。

浮点数规范化格式真值e的范围是:-1022 < e < 1023。
浮点数非规范化格式需要算上f能表示的范围,即2^(-52)。

浮点数非规范化格式真值e最小值是:2^(-52)*2^(-1022)
约等于5*10^(-324)。

浮点数非规范化格式真值e最大值是:2^1024,
约等于1.7976931348623157*10^308 。

ieee754文档64位表示范围截图如下:
这里写图片描述

0 0