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

IEEE-754 floating point: Divide first or multiply first for best precision?

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

a = b * c / d

a = b / d * c

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

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

您可能会发现研究 Goldberg 的开创性论文 What Every Computer Scientist Should Know About Floating-Point Arithmetic 很有用,它比您可能在此处收到的任何答案都更能解释事情。 (Goldberg 是 IEEE-754 的原作者之一。)

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

的低精度

无论如何,在没有 overflow/underflow 的情况下,只有尾数的精确值很重要,与指数无关。

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