Код: Выделить всё
-21868
381874348283167701/8796093022208
81525135/65536
-0x1.55b0000000000p+14
+0x1.532c2c939020fp+15
+0x1.36fe63c000000p+10
< /code>
Реализация C будет иметь доступ только к этим величинам, а не к истинным рациональным.200463504468116437/8796093022208
< /code>
и при разделении производит < /p>
0x1.64183f632041fp+14
< /code>
Но наивная сумма индивидуального удвоения-< /p>
0x1.64183f632041ep+14
< /code>
, который имеет один бит ошибки. Я попытался устранить ошибку, используя следующие стратегии: < /p>
Я попытался сделать сумму по каждой перестановке терминов: < /p>
for permutation in itertools.permutations(terms):
print(sum(permutation))
< /code>
Это не изменяет выход.def kahan(terms: typing.Iterable[float]) -> float:
# https://en.wikipedia.org/wiki/Kahan_sum ... _algorithm
total = 0
comp = 0
for term in terms:
y = term - comp
t = total + y
comp = (t - total) - y
total = t
return total
for permutation in itertools.permutations(terms):
print(kahan(permutation))
< /code>
Это не изменяет выход. Есть ли способ изменить или заменить сумму кахана, чтобы уменьшить эту ошибку?
Подробнее здесь: https://stackoverflow.com/questions/796 ... triple-sum