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

时间:2009-04-29 06:30:19

标签: floating-point precision processor operations

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

我对视频游戏控制台的实用术语特别感兴趣。例如,Nintendo 64是否具有64位处理器,如果确实如此,则意味着它能够进行双精度浮点运算? PS3和Xbox 360能否实现双精度浮点运算或单精度运算,一般情况下使用双精度功能(如果存在?)。

11 个答案:

答案 0 :(得分:186)

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

  

许多游戏都利用了芯片的32位处理模式,因为3D游戏通常不需要64位数据类型可用的更高数据精度,以及处理64位数据使用两倍的事实RAM,缓存和带宽,从而降低整体系统性能。

来自Webopedia

  

术语双精度是一种误称,因为精度不是真的两倍   double这个词来源于这样一个事实:双精度数字使用的位数是常规浮点数的两倍   例如,如果单精度数需要32位,则其双精度对应长度为64位。

     

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

来自IEEE standard for floating point arithmetic

单精度

IEEE单精度浮点标准表示需要32位字,可以表示为从0到31编号,从左到右。

  • 第一位是符号位,S,
  • 接下来的8位是指数位,'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,
  • 接下来的11位是指数位,'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,
二进制浮点运算标准。

答案 1 :(得分:26)

我读了很多答案,但似乎都没有正确解释 double 这个词的来源。我记得几年前一位大学教授给出的非常好的解释。

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

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

表示:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(只是指出,符号位是最后一位,而不是第一位。)

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

  • 符号的1位,S
  • 指数的11位,“E”
  • 53位分数 / 尾数 / 系数(即使只代表52个),'M'

表示:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

正如您可能注意到的那样,我写道,在两种类型中,尾数与其表示形式相比,有更多的信息。实际上,尾数是一个没有所有非有意义0的数字。例如,

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

这意味着尾数将始终采用

形式

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

其中β是表示的基础。但由于分数是二进制数,α 1 总是等于1,因此分数可以重写为1.α 2 α 3 ...α t + 1 ×2 p 并且可以隐式假设初始1,为额外的位留出空间(α t + 1 < /子>)。

现在,显然32的两倍是64,但这不是这个词的来源。

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

话虽如此,很容易估计可以安全使用的小数位数:

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

答案 2 :(得分:16)

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

但那意味着是什么意思?如果我们假设IEEE标准,则单个精度数具有约23位的尾数,最大指数约为38;双精度的尾数为52位,最大指数约为308。

详情请见Wikipedia,与往常一样。

答案 3 :(得分:8)

在这里添加所有精彩答案

首先, float double 都用于表示数字小数。因此,两者之间的差异源于他们可以存储数字的精确度。

  

例如:我必须存储123.456789一个人可能只能存储123.4567而其他人可以存储确切的123.456789。

所以,基本上我们想知道这个数字存储的准确程度,我们称之为精确度。

在这里引用@Alessandro

  

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

Float可以在小数部分准确存储大约7-8位数字 Double可以准确地存储小数部分中的大约15-16位数

因此,float可以存储小数部分的两倍。这就是为什么Double被称为双倍的浮动

答案 4 :(得分:6)

至于问题“ps3和xbxo 360是否可以实现双精度浮点运算或仅使用单精度,并且在使用中是双精度功能(如果它们存在?)。”

我认为这两个平台都无法实现双浮点。最初的Cell处理器只有32位浮点数,与XBox 360所基于的ATI硬件相同(R600)。 Cell稍后获得了双浮点支持,但我很确定PS3不会使用该芯片。

答案 5 :(得分:4)

基本上single precision浮点运算处理32位浮点数,而double precision处理64位。

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

答案 6 :(得分:1)

双精度意味着数字需要两倍的字长才能存储。在32位处理器上,字都是32位,因此双精度是64位。这在性能方面意味着对双精度数字的操作需要更长的时间来执行。所以你获得了更好的范围,但是性能受到了很小的影响。硬件浮点单元可以缓解这种打击,但它仍然存在。

N64使用基于MIPS R4300i的NEC VR4300,它是一个64位处理器,处理器通过32位宽总线与系统的其余部分通信。因此,大多数开发人员使用32位数字是因为它们更快,而且当时大多数游戏都不需要额外的精度(所以他们使用的浮点数不是双倍数。)

所有三个系统都可以执行单精度和双精度浮点运算,但由于性能原因,它们可能不会。 (尽管n64之后的所有内容都使用了32位总线,所以...)

答案 7 :(得分:1)

所有内容都进行了详尽的解释,我无能为力了。尽管我想用Layman的术语或简单的英语来解释它

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

一个能够存储或表示“ 1.9”的变量所提供的精度要低于能够保持或表示1.9999的变量。在大型计算中,这些分数可能会产生巨大差异。

答案 8 :(得分:0)

根据IEEE754 •浮点存储标准 •32位和64位标准(单精度和双精度) •分别为8位和11位指数 •中间结果的扩展格式(尾数和指数)

答案 9 :(得分:0)

首先浮点数和双精度数都用于表示数字小数。因此,两者之间的差异源于它们可以存储数字的精度。

例如:我必须存储123.456789,一个可能只能存储123.4567,而另一个可能只能存储精确的123.456789。

所以,基本上,我们想知道数字可以存储多少精度,这就是我们所说的精度。

在这里引用@Alessandro

精度表示正确的小数位数,即没有任何形式的表示误差或近似值。换句话说,它表示一个人可以安全使用多少个十进制数字。

浮点数可以精确存储小数部分的7-8位数字,而Double可以精确存储小数部分的15-16位数字

因此,double可以存储浮点数的两倍的小数部分。这就是为什么Double称为double float的原因

答案 10 :(得分:-3)

单精度数使用32位,MSB为符号位,而双精度数使用64位,MSB为符号位

单精度

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

双精度:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)