0

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

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

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

谢谢

4

3 回答 3

3

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

于 2012-06-13T18:36:22.330 回答
1

在现代计算机上,双精度计算(1 个符号位、11 个指数位、52 个显式有效位)与单精度计算(1 个符号位、8 个指数位、23 个有效位)一样快是很常见的。因此,当您加载浮点对象、计算和存储浮点对象时,编译器可能会将浮点值加载到双精度寄存器中,以双精度计算并存储单精度结果。这通过以极低的成本提供额外的精度而使您受益。结果可能更经常“正确舍入”(返回的结果是最接近数学精确结果的可表示值),但这不能保证(因为仍然存在舍入误差,

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

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

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

于 2012-06-13T22:24:28.050 回答
0

这与 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 。

于 2012-06-13T18:35:15.020 回答