При работе с операциями с числами с плавающей запятой мы часто получаем аппроксимированный ответ, поскольку числа с плавающей запятой представлены в компьютерном оборудовании как основание 2 и, следовательно, должны быть аппроксимированы двоичными числами с плавающей запятой, фактически сохраненными в машине.Однако я не понимаю, как часто эти ошибки зависят от их размера и порядка их добавления.
В следующем примере я добавляю (x + y) + z и x + (y + z) и сравнение результата.Далее я меняю размеры x , y и z .В этом примере мы видим, что большее значение z значительно уменьшает количество ошибок округления.
from random import random
def float_error(c1, c2, c3):
RANGE = 10000
i = 0
for _ in range(RANGE):
x = c1*random()
y = c2*random()
z = c3*random()
res1 = x + (y + z)
res2 = (x + y) + z
if res1 != res2:
i += 1
return 100*i/RANGE
test_set = [(500,1,1),(1,500,1),(1,1,500)]
for coeffs in test_set:
c1,c2,c3 = coeffs
print(f"c1={c1:>3}, c2={c2:>3}, c3={c3:>3} | Iterations with error: {float_error(c1,c2,c3):>.2f}%")
Вывод:
c1=500, c2= 1, c3= 1 | Iterations with error: 24.64%
c1= 1, c2=500, c3= 1 | Iterations with error: 0.94%
c1= 1, c2= 1, c3=500 | Iterations with error: 24.55%
Почему это происходит?