文档库 最新最全的文档下载
当前位置:文档库 › 浮点数和定点数的区别

浮点数和定点数的区别

浮点数和定点数的区别
浮点数和定点数的区别

cloudseawang

定点数与浮点数区别

最近做HDR时,经常要用NV提供的16位纹理,它的说明书16位能达到24位的精度,就很奇怪?一直搞不懂浮点数的精度怎么算的?

今天认真看了一下IEEE float point的标准,终于明白是什么了

1. 什么是浮点数

在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如99.00 或者00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如123.45 用十进制科学计数法可以表达为1.2345 × 102 ,其中1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。同样的数值可以有多种浮点数表达方式,比如上面例子中的123.45 可以表达为12.345 ×101,0.12345 × 103 或者1.2345 × 102。因为这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式:

±d.dd...d × β e , (0 ≤ d i < β)

其中 d.dd...d 即尾数,β 为基数,e 为指数。尾数中数字的个数称为精度,在本文中用p 来表示。每个数字d 介于0 和基数之间,包括0。小数点左侧的数字不为0。

基于规范表达的浮点数对应的具体值可由下面的表达式计算而得:

±(d 0 + d 1β-1 + ... + d p-1β-(p-1))β e , (0 ≤ d i < β)

对于十进制的浮点数,即基数β 等于10 的浮点数而言,上面的表达式非常容易理解,也很直白。计算机内部的数值表达是基于二进制的。从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。只是此时β 等于2,而每个数字d 只能在0 和 1 之间取值。比如二进制数1001.101 相当于1 × 2 3 + 0 × 22 + 0 ×21 + 1 ×20 + 1 ×2-1 + 0 ×2-2 + 1 ×2-3,对应于十进制的9.625。其规范浮点数表达为1.001101 × 23。

2. IEEE 浮点数

计算机中是用有限的连续字节保存浮点数的。保存这些浮点数当然必须有特定的格式,Java 平台上的浮点数类型float 和double 采纳了IEEE 754 标准中所定义的单精度32 位浮点数和双精度64 位浮点数的格式。

注意: Java 平台还支持该标准定义的两种扩展格式,即float-extended-exponent 和double-extended-exponent 扩展格式。这里将不作介绍,有兴趣的读者可以参考相应的参考资料。

在IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,

指数和尾数。这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。具体的格式参见下面的图例:

在上面的图例中,第一个域为符号域。其中0 表示数值为正数,而1 则表示负数。第二个域为指数域,对应于我们之前介绍的二进制科学计数法中的指数部分。其中单精度数为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 在右侧补齐。

值得注意的是,对于单精度数,由于我们只有24 位的指数(其中一位隐藏),所以可以表达的最大指数为224 - 1 = 16,777,215。特别的,16,777,216 是偶数,所以我们可以通过将它除以2 并相应地调整指数来保存这个数,这样16,777,216 同样可以被精确的保存。相反,数值16,777,217 则无法被精确的保存。由此,我们可以看到单精度的浮点数可以表达的十进制数值中,真正有效的数字不高于8 位。事实上,对相对误差的数值分析结果显示有效的精度大约为7.22 位。参考下面的示例:

true value stored value

--------------------------------------

16,777,215 1.6777215E7

16,777,216 1.6777216E7

16,777,217 1.6777216E7

16,777,218 1.6777218E7

16,777,219 1.677722E7

16,777,220 1.677722E7

16,777,221 1.677722E7

16,777,222 1.6777222E7

16,777,223 1.6777224E7

16,777,224 1.6777224E7

16,777,225 1.6777224E7

--------------------------------------根据标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入。这有点像我们熟悉的十进制的四舍五入,即不足一半则舍,一半以上(包括一半)则进。不过对于二进制浮点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为

零者。从上面的示例中可以看出,奇数都被舍入为偶数,且有舍有进。我们可以将这种舍入误差理解为"半位"的误差。所以,为了避免7.22 对很多人造成的困惑,有些文章经常以7.5 位来说明单精度浮点数的精度问题。

提示: 这里采用的浮点数舍入规则有时被称为舍入到偶数(Round to Even)。相比简单地逢一半则进的舍入规则,舍入到偶数有助于从某些角度减小计算中产生的舍入误差累积问题。因此为IEEE 标准所采用。

3. 实数和浮点数之间的变换

现在我们已经明白了浮点数的IEEE 表达方式。我们来做些实数和浮点数之间的变换练习以加深理解。在这些练习中,你还会发现一些围绕浮点数运算的令人吃惊的事实。

首先我们来看看事情简单的一面,从浮点数变换到实数。理解了浮点数的格式,做这个练习并不难。假定我们有一个32 位的数据,用十六进制表示为0xC0B40000,并且我们知道它实际上是一个单精度的浮点数。为了得到该浮点数实际表达的实数,我们首先将它变换为二进制形式:

C 0 B 4 0 0 0 0

1100 0000 1011 0100 0000 0000 0000 0000接着按照浮点数的格式切分为相应的域:

1 10000001 01101000000000000000000符号域1 意味着负数;指数域为129 意味着实际的指数为

2 (减去偏差值127);尾数域为01101 意味着实际的二进制尾数为1.01101 (加上隐含的小数点前面的1)。所以,实际的实数为:

-1.01101 × 22

-(20 + 2-2 + 2-3 2-5) × 22

-5.625从实数向浮点数变换稍微麻烦一点。假定我们需要将实数-9.625 表达为单精度的浮点数格式。方法是首先将它用二进制浮点数表达,然后变换为相应的浮点数格式。

首先,将小数点左侧的整数部分变换为其二进制形式,9 的二进制性形式为1001。处理小数部分的算法是将我们的小数部分乘以基数2,记录乘积结果的整数部分,接着将结果的小数部分继续乘以2,并不断继续该过程:

0.625 × 2 = 1.25 1

0.25 × 2 = 0.5 0

0.5 × 2 = 1 1

0当最后的结果为零时,结束这个过程。这时右侧的一列数字就是我们所需的二进制小数部分,即0.101。这样,我们就得到了完整的二进制形式1001.101。用规范浮点数表达为1.001101 × 23。

因为是负数,所以符号域为1。指数为3,所以指数域为 3 + 127 = 130,即二进制的10000010。尾数省略掉小数点左侧的1 之后为001101,右侧用零补齐。最终结果为:

1 10000010 00110100000000000000000最后可以将浮点数形式表示为十六进制的数据如下:1100 0001 0001 1010 0000 0000 0000 0000

C 1 1 A 0 0 0 0最终结果为0xC11A0000。

很简单?等等!你可能已经注意到了,在上面这个我们有意选择的示例中,不断的将产生的小数部分乘以 2 的过程掩盖了一个事实。该过程结束的标志是小数部分乘以 2 的结果为1,不难想象,很多小数根本不能经过有限次这样的过程而得到结果(比如最简单的0.1)。我们已经知道浮点数尾数域的位数是有限的,为此,浮点数的处理办法是持续该过程直到由此得到的尾数足以填满尾数域,之后对多余的位进行舍入。换句话说,除了我们之前讲到的精度问题之外,十进制到二进制的变换也并不能保证总是精确的,而只能是近似值。事实上,只有很少一部分十进制小数具有精确的二进制浮点数表达。再加上浮点数运算过程中的误差累积,结果是很多我们看来非常简单的十进制运算在计算机上却往往出人意料。这就是最常

见的浮点运算的"不准确"问题。参见下面的Java 示例:

System.out.print("34.6-34.0=" + (34.6f-34.0f));这段代码的输出结果如下:

34.6-34.0=0.5999985产生这个误差的原因是34.6 无法精确的表达为相应的浮点数,而只能保存为经过舍入的近似值。这个近似值与34.0 之间的运算自然无法产生精确的结果。

4. 特殊值

通过前面的介绍,你应该已经了解的浮点数的基本知识,这些知识对于一个不接触浮点数应用的人应该足够了。不过,如果你兴趣正浓,或者面对着一个棘手的浮点数应用,可以通过本节了解到关于浮点数的一些值得注意的特殊之处。

我们已经知道,指数域实际可以表达的指数值的范围为-127 到128 之间(包含两端)。其中,值-127(保存为全0)以及+128(保存为全1)保留用作特殊值的处理。本节将详细IEEE 标准中所定义的这些特殊值。

浮点数中的特殊值主要用于特殊情况或者错误的处理。比如在程序对一个负数进行开平方时,一个特殊的返回值将用于标记这种错误,该值为NaN(Not a Number)。没有这样的特殊值,对于此类错误只能粗暴地终止计算。除了NaN 之外,IEEE 标准还定义了±0,±∞ 以及非规范化数(Denormalized Number)。

对于单精度浮点数,所有这些特殊值都由保留的特殊指数值-127 和128 来编码。如果我们分别用emin 和emax 来表达其它常规指数值范围的边界,即-126 和127,则保留的特殊指数值可以分别表达为emin - 1 和emax + 1; 。基于这个表达方式,IEEE 标准的特殊值如下所示:

其中f 表示尾数中的小数点右侧的(Fraction)部分。第一行即我们之前介绍的普通的规范化浮点数。随后我们将分别对余下的特殊值加以介绍。

4.1. NaN

NaN 用于处理计算中出现的错误情况,比如0.0 除以0.0 或者求负数的平方根。由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为emax + 1 = 128(指数域全为1),且尾数域不等于零的浮点数。IEEE 标准没有要求具体的尾数域,所以NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾数域的值来表达NaN,比如Java 中的常量Float.NaN 的浮点数可能表达为01111111110000000000000000000000,其中尾数域的第一位为1,其余均为0(不计隐藏的一位),但这取决系统的硬件架构。Java 中甚至允许程序员自己构造具有特定位模式的NaN 值(通过Float.intBitsToFloat() 方法)。比如,程序员可以利用这种定制的NaN 值中的特定位模式来表达某些诊断信息。

定制的NaN 值,可以通过Float.isNaN() 方法判定其为NaN,但是它和Float.NaN 常量却不相等。实际上,所有的NaN 值都是无序的。数值比较操作符<,<=,> 和>= 在任一操作数为NaN 时均返回false。等于操作符== 在任一操作数为NaN 时均返回false,即使是两个具有相同位模式的NaN 也一样。而操作符!= 则当任一操作数为NaN 时返回true。这个规则的一个有趣的结果是x!=x 当x 为NaN 时竟然为真。

可以产生NaN 的操作如下所示:

此外,任何有NaN 作为操作数的操作也将产生NaN。用特殊的NaN 来表达上述运算错误的意义在于避免了因这些错误而导致运算的不必要的终止。比如,如果一个被循环调用的浮点运算方法,可能由于输入的参数问题而导致发生这些错误,NaN 使得即使某次循环发生了这样的错误,也可以简单地继续执行循环以进行那些没有错误的运算。你可能想到,既然Java 有异常处理机制,也许可以通过捕获并忽略异常达到相同的效果。但是,要知道,

IEEE 标准不是仅仅为Java 而制定的,各种语言处理异常的机制不尽相同,这将使得代码的迁移变得更加困难。何况,不是所有语言都有类似的异常或者信号(Signal)处理机制。注意: Java 中,不同于浮点数的处理,整数的0 除以0 将抛出https://www.wendangku.net/doc/1811561471.html,ng.ArithmeticException 异常。

4.2. 无穷

和NaN 一样,特殊值无穷(Infinity)的指数部分同样为emax + 1 = 128,不过无穷的尾数域必须为零。无穷用于表达计算中产生的上溢(Overflow)问题。比如两个极大的数相乘时,尽管两个操作数本身可以用保存为浮点数,但其结果可能大到无法保存为浮点数,而必须进行舍入。根据IEEE 标准,此时不是将结果舍入为可以保存的最大的浮点数(因为这个数可能离实际的结果相差太远而毫无意义),而是将其舍入为无穷。对于负数结果也是如此,只不过此时舍入为负无穷,也就是说符号域为1 的无穷。有了NaN 的经验我们不难理解,特殊值无穷使得计算中发生的上溢错误不必以终止运算为结果。

无穷和除NaN 以外的其它浮点数一样是有序的,从小到大依次为负无穷,负的有穷非零值,正负零(随后介绍),正的有穷非零值以及正无穷。除NaN 以外的任何非零值除以零,结果都将是无穷,而符号则由作为除数的零的符号决定。

回顾我们对NaN 的介绍,当零除以零时得到的结果不是无穷而是NaN 。原因不难理解,当除数和被除数都逼近于零时,其商可能为任何值,所以IEEE 标准决定此时用NaN 作为商比较合适。

4.3. 有符号的零

因为IEEE 标准的浮点数格式中,小数点左侧的 1 是隐藏的,而零显然需要尾数必须是零。所以,零也就无法直接用这种格式表达而只能特殊处理。

实际上,零保存为尾数域为全为0,指数域为emin - 1 = -127,也就是说指数域也全为0。考虑到符号域的作用,所以存在着两个零,即+0 和-0。不同于正负无穷之间是有序的,IEEE 标准规定正负零是相等的。

零有正负之分,的确非常容易让人困惑。这一点是基于数值分析的多种考虑,经利弊权衡后形成的结果。有符号的零可以避免运算中,特别是涉及无穷的运算中,符号信息的丢失。举例而言,如果零无符号,则等式1/(1/x) = x 当x = ±∞ 时不再成立。原因是如果零无符号,1 和正负无穷的比值为同一个零,然后1 与0 的比值为正无穷,符号没有了。解决这个问题,除非无穷也没有符号。但是无穷的符号表达了上溢发生在数轴的哪一侧,这个信息显然是不能不要的。零有符号也造成了其它问题,比如当x=y 时,等式1/x = 1/y 在x 和y 分别为+0 和-0 时,两端分别为正无穷和负无穷而不再成立。当然,解决这个问题的另一个思路是和无穷一样,规定零也是有序的。但是,如果零是有序的,则即使if (x==0) 这样简单的判断也由于x 可能是±0 而变得不确定了。两害取其轻者,零还是无序的好。

4.4. 非规范化数

我们来考察浮点数的一个特殊情况。选择两个绝对值极小的浮点数,以单精度的二进制浮点数为例,比如1.001 × 2-125 和 1.0001 × 2-125 这两个数(分别对应于十进制的2.6448623 ×10-38 和2.4979255 × 10-38)。显然,他们都是普通的浮点数(指数为-125,大于允许的最小值-126;尾数更没问题),按照IEEE 754 可以分别保存为00000001000100000000000000000000(0x1100000)和00000001000010000000000000000000(0x1080000)。

现在我们看看这两个浮点数的差值。不难得出,该差值为0.0001 × 2-125,表达为规范浮点数则为1.0 × 2-129。问题在于其指数大于允许的最小指数值,所以无法保存为规范浮点数。最终,只能近似为零(Flush to Zero)。这中特殊情况意味着下面本来十分可靠的代码也可能出现问题:

if (x != y) {

z = 1 / (x -y);

}正如我们精心选择的两个浮点数展现的问题一样,即使x 不等于y,x 和y 的差值仍然可能绝对值过小,而近似为零,导致除以0 的情况发生。

为了解决此类问题,IEEE 标准中引入了非规范(Denormalized)浮点数。规定当浮点数的指数为允许的最小指数值,即emin 时,尾数不必是规范化的。比如上面例子中的差值可以表达为非规范的浮点数0.001 ×2-126,其中指数-126 等于emin。注意,这里规定的是"不必",这也就意味着"可以"。当浮点数实际的指数为emin,且指数域也为emin 时,该浮点数仍是规范的,也就是说,保存时隐含着一个隐藏的尾数位。为了保存非规范浮点数,IEEE 标准采用了类似处理特殊值零时所采用的办法,即用特殊的指数域值emin - 1 加以标记,当然,此时的尾数域不能为零。这样,例子中的差值可以保存为00000000000100000000000000000000(0x100000),没有隐含的尾数位。

有了非规范浮点数,去掉了隐含的尾数位的制约,可以保存绝对值更小的浮点数。而且,也由于不再受到隐含尾数域的制约,上述关于极小差值的问题也不存在了,因为所有可以保存的浮点数之间的差值同样可以保存。

A 16-bit floating-point number has a 1-bit sign (S), a 5-bit

exponent (E), and a 10-bit mantissa (M). The value of a 16-bit

floating-point number is determined by the following:

(-1)^S * 0.0, if E == 0 and M == 0,

(-1)^S * 2^-14 * (M / 2^10), if E == 0 and M != 0,

(-1)^S * 2^(E-15) * (1 + M/2^10), if 0 < E < 31,

(-1)^S * INF, if E == 31 and M == 0, or

NaN, if E == 31 and M != 0,

where

S = floor((N mod 65536) / 32768),

E = floor((N mod 32768) / 1024), and

M = N mod 1024.

因此当E=0时,按非规范浮点数处理得到的结果就2^-24精度的数字

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

浮点数和定点数的区别

cloudseawang 定点数与浮点数区别 最近做HDR时,经常要用NV提供的16位纹理,它的说明书16位能达到24位的精度,就很奇怪?一直搞不懂浮点数的精度怎么算的? 今天认真看了一下IEEE float point的标准,终于明白是什么了 1. 什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如99.00 或者00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如123.45 用十进制科学计数法可以表达为1.2345 × 102 ,其中1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。同样的数值可以有多种浮点数表达方式,比如上面例子中的123.45 可以表达为12.345 ×101,0.12345 × 103 或者1.2345 × 102。因为这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式: ±d.dd...d × β e , (0 ≤ d i < β) 其中 d.dd...d 即尾数,β 为基数,e 为指数。尾数中数字的个数称为精度,在本文中用p 来表示。每个数字d 介于0 和基数之间,包括0。小数点左侧的数字不为0。 基于规范表达的浮点数对应的具体值可由下面的表达式计算而得: ±(d 0 + d 1β-1 + ... + d p-1β-(p-1))β e , (0 ≤ d i < β) 对于十进制的浮点数,即基数β 等于10 的浮点数而言,上面的表达式非常容易理解,也很直白。计算机内部的数值表达是基于二进制的。从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。只是此时β 等于2,而每个数字d 只能在0 和 1 之间取值。比如二进制数1001.101 相当于1 × 2 3 + 0 × 22 + 0 ×21 + 1 ×20 + 1 ×2-1 + 0 ×2-2 + 1 ×2-3,对应于十进制的9.625。其规范浮点数表达为1.001101 × 23。 2. IEEE 浮点数 计算机中是用有限的连续字节保存浮点数的。保存这些浮点数当然必须有特定的格式,Java 平台上的浮点数类型float 和double 采纳了IEEE 754 标准中所定义的单精度32 位浮点数和双精度64 位浮点数的格式。 注意: Java 平台还支持该标准定义的两种扩展格式,即float-extended-exponent 和double-extended-exponent 扩展格式。这里将不作介绍,有兴趣的读者可以参考相应的参考资料。 在IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示范围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

第7章DSP定点数和浮点数(重要)

第7章D S P定点数和浮点数(重要) 本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。 7.1 定点数和浮点数概念 7.2 IEEE浮点数 7.3 定点数运算 7.4总结 7.1定点数和浮点数概念 如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。 7.1.1定点数 常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。 7.1.2浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。

关于浮点数与定点数的理解

定点数与浮点数 计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x 的形式为x = x0.x1x2…x n( 其中x0为符号位,x1~x n是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位x n = 1,前面各位都为0 ,则数的绝对值最小,即|x|mi n = 2-n。如果各位均为1,则数的绝对值最大,即|x|ma x =1-2-n 。所以定点小数的表示范围是: 2- n ≤ | x| ≤ 1 - 2- n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x 的形式为x = x0x1x2…x n ( 其中x0为符号位,x1~x n是尾数,x n为最低有效位),则在计算机中的表示形式为:

定点整数的表示范围是: 1≤ | x| ≤ 2n - 1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原成实际数值。若比例因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。 用定点数进行运算处理的计算机被称为定点机。 2. 浮点数表示法(floating-point number) 4与科学计数法相似,任意一个J进制数N,总可以写成 N = J E × M 式中M称为数N 的尾数(mantissa),是一个纯小数;E为数N 的阶码(e x ponent),是一个整数,J称为比例因子J E的底数。这种表示方法相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。 底数是事先约定好的(常取2),在计算机中不出现。在机器中表示一个浮点数时,一是要给出尾数,用定点小数形式表示。尾数部分给出有效数字的位数,因而决定了浮点数的表示精度。二是要给出阶码,用整数形式表示,阶码指明

浮点运算转定点运算

与afreez一起学习DSP中浮点转定点运算 一:浮点与定点概述 1.1相关定义说明 定点数:通俗的说,小数点固定的数。以人民币为例,我们日常经常说到的如123.45¥,789.34¥等等,默认的情况下,小数点后面有两位小数,即角,分。如果小数点在最高有效位的前面,则这样的数称为纯小数的定点数,如0.12345,0.78934等。如果小数点在最低有效位的后面,则这样的数称为纯整数的定点数,如12345,78934等。 浮点数:一般说来,小数点不固定的数。比较容易的理解方式是,考虑以下我们日常见到的科学记数法,拿我们上面的数字举例,如123.45,可以写成以下几种形式: 12.345x101 1.2345 x102 0.12345 x103xi …… 为了表示一个数,小数点的位置可以变化,即小数点不固定。 1.2定点数与浮点数的对比 为了简单的把问题描述清楚,这里都是十进制数字举例,详细的分析,大家可以在后面的文章中看到。 (1)表示的精度与范围不同 例如,我们用4个十进制数来表达一个数字。对于定点数(这里以定点整数为例),我们表示区间[0000,9999]中的任何一个数字,但是如果我们要想表示类似1234.3的数值就无能为力了,因为此时的表示精度为1/100=1;如果采用浮点数来表示(以归整的科学记数法,即小数点前有一位有效位,为例),则可以表示[0.000,9.999]之间的任何一个数字,表示的精度为1/103=0.001,精度比上一种方式提高了很多,但是表示的范围却小了很多。 也就是说,一般的,定点数表示的精度较低,但表示的数值范围较大;而浮点数恰恰相反。 (2)计算机中运算的效率不同 一般说来,定点数的运算在计算机中实现起来比较简单,效率较高;而浮点数的运算在计算机中实现起来比较复杂,效率相对较低。 (3)硬件依赖性 一般说来,只要有硬件提供运算部件,就会提供定点数运算的支持(不知道说的确切否,没有听说过不支持定点数运算的硬件),但不一定支持浮点数运算,如有的很多嵌入式开发板就不提供浮点运算的支持。 1.3与DSP的关系 一般说来,DSP处理器可以分为两大类:定点与浮点。两者相比较而言,定点DSP处理器速度快,功耗低,价格也便宜;而浮点DSP则计算精度高,动态范围大。

DSP浮点转定点方法总结

CII Technologies, Inc. 目录 目录 定点运算方法 (2) 1.1数的定标 (2) 1.2 C语言:从浮点到定点 (3) 1.2.1 加法 (3) 1.2.2乘法 (5) 1.2.3除法 (6) 1.2.4 三角函数运算 (7) 1.2.5 开方运算 (8) 1.3附录 (9) 1.3.1 附录1:定点函数库 (9) 1.3.2附录2:正弦和余弦表 (18)

CII Technologies, Inc. 浮点转定点方法总结 定点运算方法 1.1 数的定标 对某些处理器而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,如何处理小数的呢?应该说,处理器本身无能为力。那么是不是就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标用Q表示法。表1.1列出了一个16位数的16种Q表示能表示的十进制数值范围和近似的精度。 Q表示精度(近似) 十进制数表示范围 Q15 0.00002 -1≤X≤0.9999695 Q14 0.00005 -2≤X≤1.9999390 Q13 0.0001 -4≤X≤3.9998779 Q12 0.0002 -8≤X≤7.9997559 Q11 0.0005 -16≤X≤15.9995117 Q10 0.001 -32≤X≤31.9990234 Q9 0.002 -64≤X≤63.9980469 Q8 0.005 -128≤X≤127.9960938 Q7 0.01 -256≤X≤255.9921875 Q6 0.02 -512≤X≤511.9804375 Q5 0.04 -1024≤X≤1023.96875 Q4 0.08 -2048≤X≤2047.9375 Q3 0.1 -4096≤X≤4095.875 Q2 0.25 -8192≤X≤8191.75 Q1 0.5 -16384≤X≤16383.5 Q0 1 -32768≤X≤32767 表1.1 Q表示、S表示及数值范围 从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如: 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为

浮点数定点运算

DSP芯片的定点运算 1.数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以16位字长为例。DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,1则表示数值为负。其余15位表示数值的大小。因此 二进制数0010000000000011b=8195 二进制数1111111111111100b=-4 对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学_运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。那么是不是说DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。表3.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。 从表3.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如: 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 但对于DSP芯片来说,处理方法是完全相同的。 从表3.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为 1/32768 = 0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。 浮点数与定点数的转换关系可表示为: 浮点数(x)转换为定点数( ): 定点数( )转换为浮点数(x): 例如,浮点数 x=0.5,定标 Q=15,则定点数=,式中表示下取整。反之,一个用 Q=15 表示的定点数16384,其浮点数为16384×2-15 =16384/32768=0.5。 表3.1 Q表示、S表示及数值范围 Q表示 S表示十进制数表示范围 Q15 S0.15 -1≤X≤0.9999695 Q14 S1.14 -2≤X≤1.9999390 Q13 S2.13 -4≤X≤3.9998779 Q12 S3.12 -8≤X≤7.9997559 Q11 S4.11 -16≤X≤15.9995117 Q10 S5.10 -32≤X≤31.9990234 Q9 S6.9 -64≤X≤63.9980469 Q8 S7.8 -128≤X≤127.9960938 Q7 S8.7 -256≤X≤255.9921875 Q6 S9.6 -512≤X≤511.9804375 Q5 S10.5 -1024≤X≤1023.96875 Q4 S11.4 -2048≤X≤2047.9375 Q3 S12.3 -4096≤X≤4095.875 Q2 S13.2 -8192≤X≤8191.75 Q1 S14.1 -16384≤X≤16383.5 Q0 S15.0 -32768≤X≤32767

定点数和浮点数表示

定点数 目录[隐藏] 定点数 1 定点数的表示 1.1 无符号数的表示 1.2 带符号数的表示 (1) 定点整数 (2) 定点小数 (3) 原码表示 (4) 补码表示 定点数 1 定点数的表示 1.1 无符号数的表示 1.2 带符号数的表示 (1) 定点整数 (2) 定点小数 (3) 原码表示 (4) 补码表示 ?(5) 反码表示 ?(6) 移码 ?定点数与浮点数的比较

原码乘法 [编辑本段] 定点数 【dìng diǎn shù 】 计算机中采用的一种数的表示方法。参与运算的数的小数点位置固定不变。 [编辑本段] 1 定点数的表示 [编辑本段] 1.1 无符号数的表示 指整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。若机器字长为n+1为,则数值表示为:

X=X0X1X2...Xn 其中Xi={0,1}, 0<=i<=n 即X0*2^n + X1*2 ^(n-1) + X2*2^(n-2) + ... + Xn-1*2 + Xn 数值范围是0≤X≤2^(n+1) - 1 例如:1111表示15。 [编辑本段] 1.2 带符号数的表示 最高位被用来表示符号位,而不再表示数值位。 [编辑本段] (1) 定点整数 小数点位固定在最后一位之后称为定点整数。若机器字长为n +1为,数值表示为: X=X0X1X2...Xn,其中Xi={0,1},0≤i≤n 即(-1)^X0 * (X1*2^(n -1) + X2*2^(n-2) + ... + Xn-1*2 + Xn) 数值范围是-(2^n-1)≤0≤2^n-1 例如:1111表示-7。 [编辑本段] (2) 定点小数 小数点固定在最高位之后称为定点小数。若机器字长为n+1为,数值表示为: X=X0.X1X2...Xn,其中Xi={0,1},0≤i≤n (这里X0不表示数字,只表示符号,若X0=0,则代表X=0.X1X2...Xn,X0=1,则代表-0.X1X2...Xn)。

定点与浮点运算的比较

定点与浮点运算DSP的比较 定点运算DSP在应用中已取得了极大的成功,而且仍然是DSP应用的主体。然而,随着对DSP处理速度与精度、存储器容量、编程的灵活性和方便性要求的不断提高、自80年代中后期以来,各DSP生产厂家陆续推出了各自的32bit 浮点运算DSP。 和定点运算DSP相比,浮点运算DSP具有许多优越性: 浮点运算DSP比定点运算DSP的动态范围要大很多。定点DSP的字长每增加1bit,动态范围扩大6dB。16bit字长的动态范围为96dB。程序员必须时刻关注溢出的发生。例如,在作图像处理时,图像作旋转、移动等,就很容易产生溢出。这时,要么不断地移位定标,要么作截尾。前者要耗费大量的程序空间和执行时间,后者则很快带来图像质量的劣化。总之,是使整个系统的性能下降。在处理低信噪比信号的场合,例如进行语音识别、雷达和声纳信号处理时,也会发生类似的问题。而32bit浮点运算DSP的动态范围可以作到1536dB,这不仅大大扩大了动态范围,提高了运算精度,还大大节省了运算时间和存储空间,因为大大减少了定标,移位和溢出检查。 由于浮点DSP的浮点运算用硬件来实现,可以在单周期内完成,因而其处理速度大大高于定点DSP。这一优点在实现高精度复杂算法时尤为突出,为复杂算法的实时处理提供了保证。 32bit浮点DSP的总线宽度较定点DSP宽得多,因而寻址空间也要大得多。这一方面为大型复杂算法提供了可能、因为省的DSP目标子程序已使用到几十MB存储器或更多;另一方面也为高级语言编译器、DSP操作系统等高级工具软件的应用提供了条件。 DSP的进一步发展,必然是多处理器的应用。新型的浮点DSP已开始在通信口的设置和强化、资源共享等方面有所响应。

浮点转定点方法总结

浮点转定点方法总结 —孔德琦

目录 定点运算方法................................................ 错误!未定义书签。 数的定标 ............................................... 错误!未定义书签。 C语言:从浮点到定点 ................................. 错误!未定义书签。 加法.................................................... 错误!未定义书签。 乘法..................................................... 错误!未定义书签。 除法..................................................... 错误!未定义书签。 三角函数运算............................................ 错误!未定义书签。 开方运算................................................ 错误!未定义书签。 附录...................................................... 错误!未定义书签。 附录1:定点函数库...................................... 错误!未定义书签。 附录2:正弦和余弦表..................................... 错误!未定义书签。

相关文档