浮点计算和舍入

Floating point computations and rounding

本文关键字:舍入 计算      更新时间:2023-10-16

我想我在某处读到cpu的"在50位中进行一些浮点计算,以便它们可以正确地向下舍入到32位"。我认为这意味着在上述浮点运算中计算的中间值以 50 位计算,以便可以实现"正确舍入到浮点大小"。

这句话是什么意思?是真的吗?如果是这样,你能指出一些资源来解释为什么他们需要计算 18 个额外的位吗?为什么不是 19 或 17?还是只是完全错误的?

编辑:- 我发现这个链接非常有用且详尽无遗...http://www.gamasutra.com/view/news/167402/Indepth_Intermediate_floatingpoint_precision.php

谢谢

我无论如何都不能保证,但我猜你遇到的实际上是 53 位而不是 50 位。他们使用 53 位的原因是因为这是浮点类型的下一个标准大小。在 IEEE 754 标准中,最小类型总共为 32 位。下一个大小是总共 64 位,具有 53 位有效数(又名尾数)。由于他们已经有专门处理该大小的硬件,因此(在大多数情况下)在该大小下执行计算,然后四舍五入到较小的大小可能是最简单的(在大多数情况下)。

在现代计算机上,双精度计算(1 个符号位、11 个指数位、52 个显式有效位)与单精度计算(1 个符号位、8 个指数位、23 个有效位)计算一样快。因此,当您加载浮点对象、计算和存储浮点对象时,编译器可能会将浮点值加载到双精度寄存器中,以双精度计算,并存储单精度结果。这有利于您以极低的成本提供额外的精度。结果可能更经常地"正确舍入"(返回的结果是最接近数学精确结果的可表示值),但这不能保证(因为仍然存在舍入误差,这些误差可能会以意想不到的方式相互作用)或者通常可能更准确(比浮点计算提供的更接近确切结果)(但这也不能保证), 但是,在极少数情况下,双精度计算返回的结果可能比单精度计算差。

有时双精度比单精度更昂贵,尤其是在执行 SIMD 编程时。

通常,高级语言让编译器自由决定如何计算浮点表达式,因此编译器可能会使用单精度或双精度,具体取决于供应商的选择(或编译器的质量)、您传递给编译器的优化和目标开关、正在编译的代码的其他方面(例如,机器寄存器的可用性来进行计算), 以及其他出于实际目的可能是随机的因素。所以这不是你可以依赖的行为。

您听到的另一个含义可能是,单精度函数(如 sinf 或 logf)的库例程可能以双精度编写,以便它们比必须完全以单精度编写更容易获得所需的结果。这很常见。但是,此类库例程是由分析计算过程中可能发生的错误的专家精心编写的,因此不仅仅是假设更多的位会产生更好的结果。

这与 epsilon 值有关。以经典的 0.1 + 0.2 问题为例:http://0.30000000000000004.com/

在大多数语言中,0.1 + 0.2 != 0.3。这是因为虽然 0.1 和 0.2 以 10 为底终止小数,但在以 2 为底,0.1 看起来像 0.0001100110011...而 0.2 看起来像 0.001100110011...这意味着当你将这两个值相加时,当你获得无限精度时,你会得到一个接近 0.3 的重复二进制数,类似于0.333333333... + 0.33333333....接近 2/3,因为您越来越精确。

至于为什么 18 个额外位与 19 个额外位,这是一个更复杂的讨论。有关更多详细信息,请参阅 http://en.wikipedia.org/wiki/Machine_epsilon。