单精度浮点运算和双精度浮点运算有什么区别?
我对与视频游戏机相关的实用术语特别感兴趣。例如,Nintendo 64 是否有 64 位处理器,如果有,那是否意味着它能够进行双精度浮点运算?PS3 和 Xbox 360 可以执行双精度浮点运算还是仅执行单精度运算,并且通常使用的是双精度功能(如果存在的话?)。
注意:Nintendo 64确实有一个 64 位处理器,但是:
许多游戏都利用了芯片的 32 位处理模式,因为 3D 游戏通常不需要 64 位数据类型提供的更高数据精度,而且处理 64 位数据使用两倍的 RAM、缓存和带宽,从而降低整体系统性能。
来自网络百科:
术语双精度有点用词不当,因为精度并不是真正的双精度。 double 这个词源于一个事实,即双精度数使用的位数是常规浮点数的两倍。 例如,如果一个单精度数需要 32 位,那么它的双精度数将是 64 位长。 额外的位不仅增加了精度,还增加了可以表示的幅度范围。 增加精度和幅度范围的确切数量取决于程序用于表示浮点值的格式。 大多数计算机使用称为 IEEE 浮点格式的标准格式。
术语双精度有点用词不当,因为精度并不是真正的双精度。 double 这个词源于一个事实,即双精度数使用的位数是常规浮点数的两倍。 例如,如果一个单精度数需要 32 位,那么它的双精度数将是 64 位长。
额外的位不仅增加了精度,还增加了可以表示的幅度范围。 增加精度和幅度范围的确切数量取决于程序用于表示浮点值的格式。 大多数计算机使用称为 IEEE 浮点格式的标准格式。
IEEE 双精度格式的精度实际上是单精度格式的 两倍 多,范围也更大。
来自IEEE 浮点运算标准
单精度
IEEE 单精度浮点标准表示需要一个 32 位字,它可以表示为从左到右从 0 到 31 的编号。
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1 8 9 31
单词表示的值V可以如下确定:
0<E<255
V=(-1)**S * 2 ** (E-127) * (1.F)
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 的编号。
S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0 1 11 12 63
0<E<2047
V=(-1)**S * 2 ** (E-1023) * (1.F)
V=(-1)**S * 2 ** (-1022) * (0.F)
参考: ANSI/IEEE 标准 754-1985, 二进制浮点算术标准。