如果我想在使用IEEE-754浮点值的计算中保持尽可能高的精度,那会更好:
a = b * c / d
或
a = b / d * c
有区别吗?如果有,是否取决于输入值的大小?而且,如果数量很重要,那么在知道值的一般大小时如何确定最佳排序?
答案 0 :(得分:2)
取决于值的大小。显然,如果一个除以零,所有的投注都会关闭,但如果乘法或除法导致非正规后续操作可能会失去精度。
你可能会发现研究Goldberg的开创性论文What Every Computer Scientist Should Know About Floating-Point Arithmetic会很有用,它会比你在这里收到的任何答案都要好得多。 (Goldman是IEEE-754的原始作者之一。)
答案 1 :(得分:2)
假设没有任何操作会产生溢出或下溢,并且您的输入值具有均匀分布的有效位数,那么这是等效的。好吧,我想要有一个严格的证据,人们应该做一个详尽的测试(可能在实践中不可能实现双精度,因为有2 ^ 156个输入),但是如果平均误差有差异,那么它很小。我可以使用Sipe尝试低精度。
在任何情况下,在没有溢出/下溢的情况下,只有有效数字的确切值才重要,而不是指数。
但是如果结果 a 被添加到(或从中减去)另一个表达式而没有被重用,那么从分割开始可能会更有趣,因为您可以使用以下添加对乘法进行分组一个FMA(因此只有一个舍入)。