Коэффициенты и порядок сложения изменяют коэффициент погрешности округления с плавающей точкой - PullRequest
0 голосов
/ 25 сентября 2019

При работе с операциями с числами с плавающей запятой мы часто получаем аппроксимированный ответ, поскольку числа с плавающей запятой представлены в компьютерном оборудовании как основание 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%

Почему это происходит?

...