xiabodan

人生天地之间,若白驹之过郤(隙),忽然而已
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

IEEE Floating Point Standard (IEEE754浮点数表示法标准)

Posted on 2014-05-05 17:59  xiabodan  阅读(630)  评论(0编辑  收藏  举报

浮点数与定点数表示法是我们在计算机中常用的表示方法 所以必须要弄懂原理,特别是在FPGA里面,由于FPGA不能像在MCU一样直接用乘除法。

定点数

首先说一下简单的定点数,定点数是克服整数表示法不能表示实数的缺陷,那么我们就可以通过将实数乘上一个分数来实现,当然要是分数就是2^-i倍数,那么我们的定点数表示法就是精确的表示,但是很不幸我们自然界中的树并不是那么凑巧。所以定点数只能是近视表示实数,包括浮点法也是这样的。具体的实现就是将表示成2进制后,然后在左移k位,那么对于N为的定点数表示法中,就有N-1-K表示整数部分,低k位表示分数,最高位表示符号。

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。

浮点数

浮点数表示法更为复杂,这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102 ,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。
提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。
在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。具体的格式参见下面的图例:


上图中可以看出S表示符号位,EXponent表示指数位,也就是“浮动”的指数位,指数的范围在32位的系统中(0-2^8 -1)/2 也就是0-127,在double型位2^11位浮动指数。

指数域中,对应于我们之前介绍的二进制科学计数法中的指数部分。其中单精度数为 8 位,双精度数为 11 位。以单精度数为例,8 位的指数为可以表达 0 到 255 之间的 255 个指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为 127,而双精度数的偏差值为 1023。比如,单精度的实际指数值 0 在指数域中将保存为 127;而保存在指数域中的 64 则表示实际的指数值 -63。 偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -127 到 128 之间(包含两端)。我们不久还将看到,实际的指数值 -127(保存为 全 0)以及 +128(保存为全 1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -127 和 127 之间。在本文中,最小指数和最大指数分别用 emin 和 emax 来表达。

图例中的第三个域为尾数域,其中单精度数为 23 位长,双精度数为 52 位长。除了我们将要讲到的某些特殊值外,IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用 23 位长的尾数域表达了 24 位的尾数。比如对于单精度数而言,二进制的 1001.101(对应于十进制的 9.625)可以表达为 1.001101 × 23,所以实际保存在尾数域中的值为 00110100000000000000000,即去掉小数点左侧的 1,并用 0 在右侧补齐。


注:单精度浮点型所谓的7.2位精度就是指的是有效位的范围,因为单精度浮点可以表达的最大指数为 2^24 - 1 = 16,777,215这个数就是有效位的最大表示数字了,超过这个数的就要进行取舍。







参考:

http://www.cnblogs.com/cloudseawang/archive/2007/02/06/641652.html

IEEE 754 Floating-Point Format

IEEE 754 FLOATING POINT REPRESENTATION