可能であれば、アルゴリズムを変更して Kahan Summation (補償された合計) を使用します。ウィキペディアから:
function KahanSum(input)
var sum = 0.0
var c = 0.0 //A running compensation for lost low-order bits.
for i = 1 to input.length do
y = input[i] - c //So far, so good: c is zero.
t = sum + y //Alas, sum is big, y small, so low-order digits of y are lost.
c = (t - sum) - y //(t - sum) recovers the high-order part of y; subtracting y recovers -(low part of y)
sum = t //Algebraically, c should always be zero. Beware eagerly optimising compilers!
//Next time around, the lost low part will be added to y in a fresh attempt.
return sum
これは、ブレゼンハムの線画アルゴリズムと同様に、累積誤差の 2 番目の実行中の合計を保持することによって機能します。最終結果は、データ型の公示精度のほぼ 2 倍の精度を取得することです。
私が使用するもう 1 つの手法は、数字を小さいものから大きいものへ (符号を無視してマニチュードで) 並べ替え、最初に小さい数字を加算または減算し、次に大きい数字を加算または減算することです。これには、同じ値を複数回加算および減算すると、そのような数値が完全にキャンセルされ、リストから削除される可能性があるという利点があります。