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

twe*_*ypi 149 floating-point precision operations processor

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

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

Von*_*onC 198

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

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

来自Webopedia:

双精度这个术语有点用词不当,因为精度不是很高.
单词double源于双精度数字使用两倍于常规浮点数的事实.
例如,如果单精度数需要32位,则其双精度对应长度为64位.

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

来自IEEE标准的浮点运算

单精度

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

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

  • 如果E = 255且F非零,则V = NaN("非数字")
  • 如果E = 255且F为零且S为1,则V = -Infinity
  • 如果E = 255且F为零且S为0,则V =无穷大
  • 如果0<E<255那时V=(-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)
Run Code Online (Sandbox Code Playgroud)

双精度

IEEE双精度浮点标准表示需要64位字,其可以表示为从0到63编号,从左到右.

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

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 如果E = 2047且F非零,则V = NaN("非数字")
  • 如果E = 2047且F为零且S为1,则V = -Infinity
  • 如果E = 2047且F为零且S为0,则V =无穷大
  • 如果0<E<2047那时V=(-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,
二进制浮点运算标准.

  • @CarlWalsh 52/23!= 2 ergo它不是"精度加倍" (11认同)
  • 我从你的来源知道这一点,但我不喜欢这句话:"双精度这个词有点用词不当,因为精度不是很高." 这些天的单精度和双精度非常普遍由IEEE定义,正如你所指出的,单精度在分数中有23位,而double有52位 - 这基本上是精度的两倍...... (9认同)
  • @ZeroDivide''**''是**[Exponentiation](http://en.wikipedia.org/wiki/Exponentiation)** (5认同)
  • @rfoo如果您想学究一点,它不是*精确地*翻倍,而是52/2&gt; 23,所以,是的,它是精度的两倍,它只是两倍,然后是更多。 (2认同)

Ale*_*dro 33

我读了很多答案,但似乎都没有正确解释字来自何处.我记得几年前一位大学教授给出的非常好的解释.

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

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

表示:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0
Run Code Online (Sandbox Code Playgroud)

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

精度浮点表示使用64位的一个字.

  • 标志为1位,S
  • 指数为11位,'E'
  • 分数/尾数/系数为53位(即使只表示52),'M'

表示:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0
Run Code Online (Sandbox Code Playgroud)

正如您可能注意到的那样,我写道,尾数在两种类型中都比其表示形式多一点信息.事实上,尾数是一个数字,而不是所有的无意义0.例如,

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

这意味着尾数将始终在表格中

0.α 1 α 2 ...α ×β 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位十进制数

  • 感谢您使用正确的位编号(符号分别为第 31 位和第 63 位)。 (2认同)

Cha*_*tin 17

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

但这意味着什么?如果我们假设IEEE标准,则单个精度数具有约23位的尾数,最大指数约为38; 双精度对于尾数具有52位,并且最大指数为大约308.

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


Sim*_*Guy 9

在这里添加所有精彩的答案

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

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

所以,基本上我们想知道数字的存储准确度是多少,我们称之为精确度.

在这里引用@Alessandro

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

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

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


Asa*_*sad 9

所有人都非常详细地解释了,我无法进一步补充。虽然我想用外行的术语或简单的英语来解释它

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999
Run Code Online (Sandbox Code Playgroud)

.....

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


cle*_*tus 6

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

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


cod*_*zen 6

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

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