【发布时间】:2013-05-16 12:57:56
【问题描述】:
a, b 是 32 位浮点值,N 是 32 位整数,k 可以取值 0, 1, 2, ... M。需要计算 c_k = a + ( N + k ) * b ;这些操作需要是 32 位操作(不是双精度)。关注的是准确性——以下哪个更准确?:
I) c_k = a + ( N + k ) * b
II) 首先计算:c_0 = a + N * b
然后通过加法迭代计算c_1、c_2等:
c_1 = c_0 + b;
c_2 = c_1 + b;
【问题讨论】:
-
我的直觉是选项 II 更好(性能更高),但我不太确定它是否更准确。我想这取决于数据。
-
链加法是你能做的最糟糕的操作之一,因为最后一个结果中的舍入误差将是链中每个加法的舍入误差之和。使用第一种方式或使用
c_i = c_0 + b*i会更准确。 -
@PatriciaShanahan 您应该在评论中提交答案。这是这个问题的关键信息。
标签: floating-point floating-accuracy multiplication addition single-precision