视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
浮点数的表示范围
2020-11-27 19:27:17 责编:小采
文档
浮点数是由符号,阶码和尾数三部分组成,浮点数分为单精度浮点数和双精度浮点数,单精度浮点数的便是范围是-3.4E38~3.4E38,双精度浮点数的范围是-1.79E+308 ~ +1.79E+308

【推荐课程:JavaScript教程】

浮点数表示

一个浮点数(Floating Point Number)由三个基本成分构成:符号(Sign)、阶码(Exponent)和尾数(Mantissa)。通常可以用下面的格式来表示浮点数:

S PM

其中S是符号位,P是阶码,M是尾数。

根据IEEE(美国电气和电子工程师学会)754标准中的定义,单精度浮点数是32位(即4字节)的,双精度浮点数是位(即8字节)的。两者的S、P、M所占的位数以及表示方法由下表可知:


S P M 表示公式偏移量
单精度浮点数1(第31位)8(30到23位)23(22到0位)(-1)^S*2(P-127)*1.M127
双精度浮点数1(第63位)11(62到52位)52(51到0位)(-1)^S*2(P-1023)*1.M1023

其中S是符号位,只有0和1,分别表示正负

P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码、反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1)。阶码可以为正数,也可以为负数,为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为127,双精度数的偏差值为1023。例如,单精度的实际指数值0在指数域中将保存为127,而保存在指数域中的则表示实际的指数值-63,偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成-127到128之间(包含两端)。

M为尾数,其中单精度数为23位长,双精度数为52位长。IEEE标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为1,因此在保存尾数的时候,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。这样实际上用23位长的尾数域表达了24位的尾数。例如对于单精度数而言,二进制的1001.101(对应于十进制的9.625)可以表达为1.001101 × 23,所以实际保存在尾数域中的值为00110100000000000000000,即去掉小数点左侧的1,并用0在右侧补齐。
根据标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入,即不足一半则舍,一半以上(包括一半)则进。不过对于二进制浮点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。

据以上分析,IEEE 754标准中定义浮点数的表示范围为:


二进制(Binary)十进制(Decimal)
单精度浮点数± (2-2^-23) × 2127~ ± 10^38.53
双精度浮点数± (2-2^-52) × 21023~ ± 10^308.25

浮点数的表示有一定的范围,超出范围时会产生溢出(Flow),一般称大于绝对值最大的数据为上溢(Overflow),小于绝对值最小的数据为下溢(Underflow)。

浮点数的表示约定

  单精度浮点数和双精度浮点数都是用IEEE 754标准定义的,其中有一些特殊约定,例如:
  1、当P=0,M=0时,表示0。
  2、当P=255,M=0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。
  3、当P=255,M≠0时,表示NaN(Not a Number,不是一个数)。
非规范浮点数

当两个绝对值极小的浮点数相减后,其差值的指数可能超出允许范围,最终只能近似为0。为了解决此类问题,IEEE标准中引入了非规范(Denormalized)浮点数,规定当浮点数的指数为允许的最小指数值时,尾数不必是规范化(Normalized)的。有了非规范浮点数,去掉了隐含的尾数位的制约,可以保存绝对值更小的浮点数。而且,由于不再受到隐含尾数域的制约,上述关于极小差值的问题也不存在了,因为所有可以保存的浮点数之间的差值同样可以保存。
根据IEEE 754标准中的定义,规范和非规范浮点数的表示范围可归纳为下表:


规范浮点数非规范浮点数十进制近似范围
单精度浮点数± 2^-149 至 (1-2^-23)*2^-126± 2^-126 至 (2-2^-23)*2^127± ~10^-44.85 至 ~10^38.53
双精度浮点数± 2^-1074 至 (1-2^-52)*2^-1022± 2^-1022 至 (2-2^-52)*2^1023± ~10^-323.3 至 ~10^308.3

与IEEE 754相关的标准

本文的结论基于IEEE 754标准,另外一个标准是IEEE 854,这个标准是关于十进制浮点数的,但没有规定具体格式,所以很少被采用。另外,从2000年开始,IEEE 754开始修订,被称为IEEE 754R,目的是融合IEEE 754和IEEE 854标准。该标准在浮点格式方面的修订有:1、加入了16位和128位的二进制浮点数格式;2、加入了十进制浮点数格式,采用了IBM公司提出的格式。

总结:

下载本文
显示全文
专题