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

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

我对与视频游戏机有关的实用术语特别感兴趣。例如,任天堂64是否有64位处理器?如果有,是否意味着它能够进行双精度浮点运算?PS3和Xbox360是否可以实现双精度浮点运算或仅实现单精度,并且在一般使用中是否使用双精度功能(如果存在?)。

335587 次浏览

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

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

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

但这_什么?ABC_0?如果我们假设IEEE标准,则单精度数字具有大约23位的尾数,并且最大指数大约为38;双精度的尾数为52位,最大指数约为308。

与往常一样,详细信息位于维基百科中。

注:任天堂64具有64位处理器,但是:

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

网络百科

术语

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

额外

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

IEEE双精度格式实际上具有更多,其精度位数是单精度格式的两倍,并且范围更大。

IEEE浮点运算标准

单精度

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

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

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

The value V represented by the word may be determined as follows:

  • If E=255 and F is nonzero, then V=NaN ("Not a number")
  • If E=255 and F is zero and S is 1, then V=-Infinity
  • If E=255 and F is zero and S is 0, then V=Infinity
  • If 0<E<255 then V=(-1)**S * 2 ** (E-127) * (1.F) where "1.F" is intended to represent the binary number created by prefixing F with an implicit leading 1 and a binary point.
  • If E=0 and F is nonzero, then V=(-1)**S * 2 ** (-126) * (0.F). These are "unnormalized" values.
  • If E=0 and F is zero and S is 1, then V=-0
  • If E=0 and F is zero and S is 0, then V=0

In particular,

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
    

The value V represented by the word may be determined as follows:

  • If E=2047 and F is nonzero, then V=NaN ("Not a number")
  • If E=2047 and F is zero and S is 1, then V=-Infinity
  • If E=2047 and F is zero and S is 0, then V=Infinity
  • If 0<E<2047 then V=(-1)**S * 2 ** (E-1023) * (1.F) where "1.F" is intended to represent the binary number created by prefixing F with an implicit leading 1 and a binary point.
  • If E=0 and F is nonzero, then V=(-1)**S * 2 ** (-1022) * (0.F) These are "unnormalized" values.
  • If E=0 and F is zero and S is 1, then V=-0
  • If E=0 and F is zero and S is 0, then V=0

Reference:
ANSI/IEEE Standard 754-1985,
Standard for Binary Floating Point Arithmetic.

至于问题“ PS3和XBXO 360是否可以实现双精度浮点运算或仅实现单精度,以及在一般使用中是否使用了双精度功能(如果存在?)”。

我相信这两个平台都不能使用双浮点。最初的Cell处理器只有32位浮点数,与Xbox360所基于的ATI硬件(R600)相同。细胞后来得到了双浮点支持,但我很确定PS3不会使用这种芯片。

双精度意味着数字需要两倍的字长来存储。在32位处理器上,字都是32位,因此双精度为64位。就性能而言,这意味着对双精度数字的操作需要更长的时间来执行。所以你得到了一个更好的范围,但对性能有一个小的影响。硬件浮点单元稍微减轻了这种冲击,但它仍然存在。

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

的所有三种系统都执行单精度和双精度浮点运算,但由于性能原因,它们可能不会执行这些运算。(尽管N64之后的几乎所有产品都使用32位总线,所以..)

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

单精度

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

双精度:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

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

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

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

代表性:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(需要指出的是,符号位是最后一个,而不是第一个。)

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

  • 1位用于符号,S
  • 11位用于指数,' E '
  • 分数/尾数/系数的53位(即使只表示了52位),

代表性:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

正如您可能注意到的,我曾写道,尾数在两种类型中都比其表示多一位信息。事实上,尾数是没有其所有非有效0来表示的数字。例如,

  • 0.000124变为0.12 4×10−3
  • 237.14 1变为0.237141×103

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

0.α1α2。α测试×βP

其中β是表示的基。但是由于分数是二进制数,α1将总是等于1,因此分数可以被重写为1.α2α3..αT+1×2P,并且可以隐含地假设初始1,为额外的位(αT+1)留出空间。

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

精确表示正确的的十进制数字的数量,即没有任何类型的表示错误或近似。换句话说,它表示安全地可以使用多少个十进制数字。

说到这里,很容易估计可以安全使用的十进制数字的数量:

  • 单精度:对数10(224),约为7~8位小数
  • 双精度:日志10(253),约15~16位十进制数字

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

首先,漂浮使加倍都用于表示数和分数。因此,两者之间的差异源于它们存储数字的精度。

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

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

引用@Alessandro的话

精度指示正确的的十进制位数, 即没有任何类型的表示误差或近似。在 换句话说,它表示安全地可以使用多少个十进制数字。

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

的15-16位数字

因此,float可以存储将小数部分的数量加倍。,这就是为什么double被称为浮点数加倍

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

的扩展格式(尾数和指数)

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

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

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

引用@Alessandro的话

精度表示正确的十进制数字的数量,即没有任何类型的表示错误或近似值。换句话说,它表示可以安全使用的十进制数字的数量。

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

因此,DOUBLE可以存储两倍于FLOAT的小数部分。这就是为什么double被称为浮点数的两倍

所有人都解释得很详细,我不能再补充了。尽管我想用通俗的语言或简单的英语来解释它。

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.9 999的变量提供的精度低。在大型计算中,这些分数可能会产生巨大的差异。