IEEE-754 浮点数:先除还是先乘以获得最佳精度?

Rog*_*ahl 5 ieee-754

如果我想在使用 IEEE-754 浮点值的计算中保持尽可能多的精度,那更好:

a = b * c / d
Run Code Online (Sandbox Code Playgroud)

或者

a = b / d * c
Run Code Online (Sandbox Code Playgroud)

有区别吗?如果有,它是否取决于输入值的大小?而且,如果幅度很重要,那么在已知值的一般幅度时如何确定最佳排序?

Edw*_*ard 6

这取决于值的大小。显然,如果一除以零,所有的赌注都会被取消,但如果乘法或除法导致非正规的后续操作可能会失去精度。

您可能会发现研究戈德堡的开创性论文《每个计算机科学家应该了解浮点算术是什么》很有用,它将比您在这里可能收到的任何答案更好地解释事情。(Goldberg 是 IEEE-754 的原作者之一。)


vin*_*c17 5

假设所有操作都不会产生上溢或下溢,并且您的输入值具有均匀分布的有效数,那么这是等效的。好吧,我想为了有一个严格的证明,应该进行详尽的测试(在实践中对于双精度可能是不可能的,因为有 2^156 个输入),但是如果平均误差存在差异,那么它是很小的。我可以用Sipe尝试低精度。

无论如何,在没有上溢/下溢的情况下,只有有效数字的精确值才重要,而不是指数。

但是,如果结果a被添加到另一个表达式(或从中减去)并且不被重复使用,那么从除法开始可能会更有趣,因为您可以使用 FMA 将乘法与以下加法分组(从而使用单舍入)。