单精度浮点运算和双精度浮点运算有什么区别?
我对视频游戏控制台的实用术语特别感兴趣。例如,Nintendo 64是否具有64位处理器,如果确实如此,则意味着它能够进行双精度浮点运算? PS3和Xbox 360能否实现双精度浮点运算或单精度运算,一般情况下使用双精度功能(如果存在?)。
答案 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编号,从左到右。
最后23位是分数'F':
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1 8 9 31
由单词表示的值V可以如下确定:
0<E<255
则V=(-1)**S * 2 ** (E-127) * (1.F)
,其中“1.F”
旨在表示通过在前缀F前面创建的二进制数
隐式前导1和二进制点。V=(-1)**S * 2 ** (-126) * (0.F)
。这些
是“非标准化”的价值观。特别是
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编号,从左到右。
最后的52位是分数'F':
S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0 1 11 12 63
由单词表示的值V可以如下确定:
0<E<2047
则V=(-1)**S * 2 ** (E-1023) * (1.F)
,其中“1.F”
旨在表示通过在前缀F前面创建的二进制数
隐式前导1和二进制点。V=(-1)**S * 2 ** (-1022) * (0.F)
这些
是“非标准化”的价值观。参考:
ANSI / IEEE标准754-1985,
二进制浮点运算标准。
答案 1 :(得分:26)
我读了很多答案,但似乎都没有正确解释 double 这个词的来源。我记得几年前一位大学教授给出的非常好的解释。
回顾VonC答案的风格,单个精度浮点表示使用32位字。
表示:
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
bits: 31 30 23 22 0
(只是指出,符号位是最后一位,而不是第一位。)
double 精度浮点表示使用64位字。
表示:
S EEEEEEEEEEE MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits: 63 62 52 51 0
正如您可能注意到的那样,我写道,在两种类型中,尾数与其表示形式相比,有更多的信息。实际上,尾数是一个没有所有非有意义0
的数字。例如,
这意味着尾数将始终采用
形式0.α 1 α 2 ...α t ×β p
其中β是表示的基础。但由于分数是二进制数,α 1 总是等于1,因此分数可以重写为1.α 2 α 3 ...α t + 1 ×2 p 并且可以隐式假设初始1,为额外的位留出空间(α t + 1 < /子>)。
现在,显然32的两倍是64,但这不是这个词的来源。
精度表示正确的小数位数,即没有任何表示错误或近似值。换句话说,它表示可以安全使用的小数位数。
话虽如此,很容易估计可以安全使用的小数位数:
答案 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)