浮点数(单精度浮点数与双精度浮点数)在计算机中的存储

  • 格式:doc
  • 大小:85.50 KB
  • 文档页数:4

下载文档原格式

  / 4
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浮点数在计算机中的存储

十进制浮点数格式:

浮点数格式使用科学计数法表示实数。科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数(exponent)两部分。比如3.684*10^2. 在十进制中,指数的基

数为10,并且表示小数点移动多少位以生成系数。每次小数点向前移动时,指数就递增;每次小数点向后移动时,指数就递减。例如,25.92 可表示为2.592 * 10^1,其中2.592 是系数,值10^1 是指数。必须把系数和指数相乘,才能得到原始的实数。另外,如0.00172 可表示为1.72*10^-3,数字1.72 必须和10^-3 相乘才能获得原始值。

二进制浮点格式:

计算机系统使用二进制浮点数,这种格式使用二进制科学计数法的格式表示数值。数字按照二进制格式表示,那么系数和指数都是基于二进制的,而不是十进制,例如 1.0101*2^2.

在十进制里,像0.159 这样的值,表示的是0 + (1/10) + (5/100) + (9/1000)。相同的原则也适用二进制。比如,1.0101 乘以2^2 后,生成二进制值101.01 ,这个值表示二进制整数5,加上分数(0/2) + (1/4) 。这生成十进制值5.25 。下表列出几个二进制

小数以及它们对应的十进制值:

二进制十进制分数十进制值

0.1 1/2 0.5

0.01 1/4 0.25

0.001 1/8 0.125

0.0001 1/16 0.0625

0.00001 1/32 0.03125

0.000001 1/64 0.015625

几个二进制浮点例子:二进制十进制分数十进制值

10.101 2+1/2+1/8 2.625

10011.001 19+1/8 19.125

10110.1101 22+1/2+1/4+1/16 22.8125

1101.011 13+1/4+1/8 13.375

编写二进制浮点值时,二进制通常被规格化了。这个操作把小数点移动到最左侧的数位,并且修改指针进行补偿。例如1101.011 变成1.101011*2^3

浮点数的存储

∙IEEE 标准754 浮点数标准使用3 个成分把实数定义为二进制浮点值:

∙符号

∙有效数字

∙指数

符号位表示值是负的还是正的。符号位中的1 表示负值,0 表示正值。

有效数字部分表示浮点数的系数(coefficient)(或者说尾数(mantissa))。系数可以是规格化的(normalized),也可以是非规格化的(denormalized)。所谓规格化,就是任何一个数的科学计数法的表示都可为1.xxx*2^n,既然小数点左边的一位都是1,就可以把这一位省略。单精度浮点数23bit的尾数部分,可表示的精度却为24位,道理就在这里。

指数表示浮点数的指数部分,是一个无符号整数。因为指数值可以是正值,也可以是负值,所以通过一个偏差值对它进行置偏,及指数的真实值=指数部分的整数—偏差值。对于32位浮点数,偏差值=127;对于64位浮点数,偏差值=1023.

浮点数的这3 个部分被包含在固定长度的数据格式之内。IEEE 标准754 定义了浮点数的两种长度:32位单精度和64位双精度

可以用于表示有效数字的位的数量决定精度。下图显示了两种不同精度类型的位布局:

单精度浮点使用23 位有效数字值。但是,浮点格式假设有效数字的整数部分永远为1 ,并且不在有效数字值中使用它。这样实际上有效数字的精度达到了24 位。指数使用8 位值,它的范围从0~255,称为移码指数,意思是必须从指数中减去一个数(称为偏移量或者是偏差值),对单精度浮点数而言,这个值是127 。当指数是0和255时,指数由别的含义,因此实际指数的范围是从-126 到+127 (二进制指数),这样整个浮点数的范围则为:(1.18 *

10^-38~1.0×2……-126 到3.40 * 10^38~1.1……1×2^127)。

∙指数0和255用于特殊用途。如果指数从1变化到254,则由s(符号位)、e(指数)和f(有效数)来表示的数为:

∙-1的s 次幂是数学上的一种方法,意思是“如果s 为0,则数是正的(因为任何数的0 次幂等于1 );如果s 为1,则数是负的(因为-1的1 次幂为-1)”。

∙表达式的另一部分是1.f,意思是1后面为二进制小数点,再后面为23位的有效小数部分。它乘以2的幂,其中指数为内存中的8位移码指数减去127。

∙注意,还有一种特殊的情况0 :

∙如果e 等于0,且f 等于0,则数为0。通常,所有32位均为0 则表示0。但是符号位可以是1,在这种情况下,数被解释为-0。-0 可以表示一个很小的数,小到在单精度格式中不能用数字和指数来表示。尽管如此,它们然小于0。

∙如果e 等于0,且f 不等于0,则数是有效的。但是,它不是规格化的数,它等于

注意,二进制小数点左边的有效数为0。

∙如果e等于255,且f等于0,则数为正或负无穷大,这取决于符号s。

∙如果e等于255,且f不等于0,该值被认为“不是一个数”,简写为NaN。NaN可以表示一个不知道的数或者一个无效操作的结果。

Q:3.40 * 10^38 是值怎么来的?

A :在单精度浮点格式中可以表示的最大规格化的正或负二进制数为:

换算成10 进制约等于:3.402823669e+38,这里1.111...111 近似为2,则 2 * 2^127 = 2^128 = 3.402823669e+38 .

Q:1.18 * 10^-38 的值是怎么来的?

A:通常,单精度浮点格式中可以表示的最小规格化的正或负二进制数为:

换算成10 进制就是:1.175494351e-38,也就是约等于1.18 * 10^-38 。

Q:单精度浮点24位换算为十进制后,为什么精度是7 位?

A:10位二进制数近似等于3位十进制数。也就是说,若10位都置1(即十六进制为3FFh,十进

制为1023),则它近似等于3位十进制都设置为9,即999。或者: