单精度和双精度浮点运算有什么区别?

单精度浮点运算和双精度浮点运算有什么区别?

我特别感兴趣的是有关video游戏机的实用术语。 例如,任天堂64有一个64位的处理器,如果这样做,那么这是否意味着它能够进行双精度浮点运算? PS3和Xbox 360能否实现双精度浮点运算或单精度浮点运算,并且一般使用的是双精度能力(如果存在的话)。

注意: 任天堂64确实有一个64位处理器,但是:

许多游戏利用了该芯片的32位处理模式,因为3D游戏通常不需要64位数据types提供的更高的数据精度,以及处理64位数据使用两倍的RAM,高速caching和带宽,从而降低整个系统的性能。

来自Webopedia :

双精度这个术语是错误的,因为精度并不是真正的双倍。
双字来源于双精度数字使用两倍于常规浮点数字的事实。
例如,如果单精度数字需要32位,则其双精度对应数据将是64位长度。

额外的位不仅增加了精度,而且增加了可以表示的幅度范围。
精度和幅度范围的增加的确切数量取决于程序用于表示浮点值的格式。
大多数计算机使用称为IEEE浮点格式的标准格式。

从IEEE标准的浮点运算

单精度

IEEE单精度浮点标准表示法需要一个32位的字,从0到31的数字可以表示为从左到右。

  • 第一位是符号位S,
  • 接下来的八位是指数位,'E'和
  • 最后的23位是分数 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF 0 1 8 9 31 

由该词表示的值V可以如下确定:

  • 如果E = 255且F不为零,则V = NaN(“不是数字”)
  • 如果E = 255并且F是零并且S是1,则V = -Infinity
  • 如果E = 255并且F是零并且S是0,则V =无穷大
  • 如果0<E<255V=(-1)**S * 2 ** (E-127) * (1.F)其中“1.F”旨在表示通过用F隐含前导1和二进制点。
  • 如果E = 0且F不为零,则V=(-1)**S * 2 ** (-126) * (0.F) 。 这些是“非标准化”的价值。
  • 如果E = 0且F为零且S为1,则V = -0
  • 如果E = 0且F为零且S为0,则V = 0

尤其是,

 0 00000000 00000000000000000000000 = 0 1 00000000 00000000000000000000000 = -0 0 11111111 00000000000000000000000 = Infinity 1 11111111 00000000000000000000000 = -Infinity 0 11111111 00000100000000000000000 = NaN 1 11111111 00100010001001010101010 = NaN 0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2 0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5 1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5 0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126) 0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 0 00000000 00000000000000000000001 = +1 * 2**(-126) * 0.00000000000000000000001 = 2**(-149) (Smallest positive value) 

双精度

IEEE双精度浮点标准表示需要一个64位的字,可以从0到63的数字表示,从左到右。

  • 第一位是符号位S,
  • 接下来的十一位是指数位,'E'和
  • 最后的52位是小数点 'F':

     S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0 1 11 12 63 

由该词表示的值V可以如下确定:

  • 如果E = 2047且F不为零,则V = NaN(“不是数字”)
  • 如果E = 2047且F是零且S是1,则V = -Infinity
  • 如果E = 2047,F是零,S是0,那么V =无穷大
  • 如果0<E<2047V=(-1)**S * 2 ** (E-1023) * (1.F)其中“1.F”旨在表示F隐含前导1和二进制点。
  • 如果E = 0且F不为零,则V=(-1)**S * 2 ** (-1022) * (0.F)这些是“非标准化”值。
  • 如果E = 0且F为零且S为1,则V = -0
  • 如果E = 0且F为零且S为0,则V = 0

参考:
ANSI / IEEE标准754-1985,
二进制浮点运算标准。

好的,机器的基本区别在于双倍精度使用两倍于单一的位数。 在通常的实现中,32位为单倍,64位为双倍。

但这是什么意思 ? 如果我们假定IEEE标准,那么一个精确的数字就有尾数约23位,最大指数约为38; 双精度的尾数为52位,最大指数约为308。

细节在维基百科 ,像往常一样。

我读了很多答案,但似乎没有正确解释字来自哪里。 我记得几年前我的一位大学教授给出的一个很好的解释。

回想VonC答案的风格, 精度浮点表示使用32位的字。

  • S为1位
  • 指数的 8位,'E'
  • 24位为分数 ,也称为尾数 ,或系数 (即使只有23代表)。 我们称之为“M”(对于尾数 ,我更喜欢这个名字,因为“分数”可能会被误解)。

表示:

  S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM bits: 31 30 23 22 0 

(只要指出,标志位是最后一个,而不是第一个。)

精度浮点表示使用64位的字。

  • S为1位
  • 指数为11位,“E”
  • 分数 / 尾数 / 系数为53比特(尽pipe只有52比特被表示),“M”

表示:

  S EEEEEEEEEEE MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM bits: 63 62 52 51 0 

正如你可能注意到的,我写到, 尾数在这两种types中都比其代表性要多一点。 实际上,尾数是一个没有全部无意义0的数字。 例如,

  • 0.000124变成0.124×10 -3
  • 237.141变为0.237141×10 3

这意味着尾数永远是在forms

0.α1α2 …αt× βp

其中β是表示的基础。 但由于分数是一个二进制数,所以α1总是等于1,因此分数可以被重写为1.α2α3 …αt + 1 ×2 p并且初始1可以被隐含地假定,为额外的位(αt + 1 )腾出空间。

现在,32的倍数是64,这显然是正确的,但这不是单词的来源。

精度表示正确的小数位数,即没有任何forms的表示误差或近似值。 换句话说,它表示可以安全使用多less个小数位。

这就是说,估计可以安全使用的小数位数很容易:

  • 单精度 :log 10 (2 24 ),大约7〜8位十进制数
  • 双精度 :log 10 (2 53 ),大约15〜16位十进制数

至于“ps3和xbxo 360可以脱离双精度浮点运算还是单精度浮点运算的问题,并且是在使用双精度性能(如果它们存在的话)”。

我相信这两个平台都不能双重浮动。 原来的Cell处理器只有32位浮点数,与XBox 360基于的ATI硬件(R600)相同。 Cell后来获得了双浮点支持,但是我很确定PS3没有使用该chippery。

基本上单精度浮点算术处理32位浮点数,而双精度处理64位。

双精度的位数增加了可以存储的最大值以及提高精度(即有效位数)。

双精度意味着数字需要两倍的字长来存储。 在一个32位的处理器上,字都是32位,所以双字是64位。 在性能方面,这意味着对双精度数字的操作需要花费更长的时间来执行。 所以你会有一个更好的范围,但是对性能有一个小的打击。 这个命中由硬件浮点单元减轻了一点,但它仍然存在。

N64使用了基于MIPS R4300i的NEC VR4300,它是一个64位处理器, 处理器通过32位宽总线与系统的其余部分进行通信。 所以,大多数开发者使用32位数字,因为他们更快,大多数游戏不需要额外的精度(所以他们使用浮动不是双打)。

这三个系统都可以进行单精度浮点运算和双精度浮点运算,但它们可能并不是因为性能。 (尽pipen64之后几乎所有的东西都使用了32位总线,所以…)

单精度数使用32位,MSB是符号位,而双精度数使用64位,MSB是符号位单精度-SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF。(SIGN + EXPONENT + SIGNIFICAND)双精度 – SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。(SIGN + EXPONENT + SIGNIFICAND)