Это упражнение из углубленного курса Udacity.python числовая ошибка: большое количество добавить небольшое число
Может ли кто-нибудь объяснить, почему окончательный ответ не является 1.0?
v1 = 1e9
v2 = 1e-6
for i in range(int(1e6)):
v1 = v1 + v2
print 'answer is', v1 - 1e9
# answer is 0.953674316406
«Если вы используете число, которое может быть представлено именно для' v2' (например, 'v2 = 1,0/(2 ** 20)') результатом запуска программы будет 0. " - нет, результат все равно около 0,95, как и должно быть, поскольку мы не вычитаем миллион кратных v2. Кроме того, точная представимость значения, используемого для v2, недостаточна; нам также нужна точность промежуточных сумм, чтобы гарантировать точно правильный конечный результат. Например, использование 'v2 = 1000.0/2 ** 30' все еще вызывает ошибку округления в промежуточных значениях, несмотря на то, что начальное значение не было окружено. – user2357112
Действительно, вам понадобится число, которое точно выражается с 1 + 3 мантиссами. 1000 = бинарный (1111101000) требуется 1 + 6 бит мантиссы. – LutzL
@ user2357112, спасибо за исправление. Действительно, я не учитывал потерю точности и тот факт, что число итераций должно быть изменено. Я уточню ответ, чтобы быть более точным. – kostya