gpt4 book ai didi

optimization - 是否有优化浮点运算以提高精度(而不是速度)的编译器?

转载 作者:行者123 更新时间:2023-12-03 15:57:07 25 4
gpt4 key购买 nike

我们知道编译器在优化我们的代码并使其运行得更快方面越来越好,但我的问题是有编译器可以优化浮点运算以确保更高的准确性。

例如,一个基本规则是先乘后加,这是因为使用浮点数的乘法和除法不会像加法和减法那样引入不准确度,但会增加加法和减法引入的不准确度,所以应该在许多情况下首先完成。

所以像这样的浮点运算

y = x*(a + b); // faster but less accurate

应该改为
y = x*a + x*b; // slower but more accurate

是否有任何编译器可以像我上面展示的那样以牺牲速度为代价来优化提高浮点精度?或者是编译器速度的主要问题而不考虑浮点运算的准确性?

谢谢

更新:所选答案显示了一个很好的示例,其中此类优化不起作用,因此编译器不可能事先知道评估 y 的更准确方法是什么。谢谢你的反例。

最佳答案

你的前提是错误的。 x*(a + b) , (通常)不低于 x*a + x*b .事实上,它通常会更准确,因为它只执行两个浮点运算(因此只产生两个舍入误差),而后者执行三个运算。

如果您了解 x 的预期值分布, a , 和 b先验,然后您可以做出明智的决定,但编译器几乎永远无法访问这种类型的信息。

除此之外,如果编写程序的人实际上是指 x*(a+b) 呢?并且特别想要由该特定操作序列引起的精确舍入?这种事情实际上在高质量的数值算法中很常见。

最好做程序员写的事情,而不是你认为他可能打算做的事情。

编辑--一个例子来说明您建议的转换导致准确性的灾难性损失的情况:假设

x = 3.1415926535897931
a = 1.0e15
b = -(1.0e15 - 1.0)

然后,在 double 中评估我们得到:
x*(a + b) = 3.1415926535897931


x*a + x*b = 3.0

关于optimization - 是否有优化浮点运算以提高精度(而不是速度)的编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com