浮点计算和舍入

时间:2012-06-13 18:27:59

标签: c++ floating-point cpu rounding

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

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

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

感谢

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

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

你所听到的另一个意思可能是单精度函数的库例程,例如sinf或logf,可以用双精度编写,这样他们就可以比他们更容易获得所需的结果完全以单精度编写。这很常见。但是,这些库例程是由专家小心编写的,他们分析了计算过程中可能出现的错误,因此不仅仅是假设更多的位会产生更好的结果。

答案 2 :(得分: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