Этажное деление // vs int() округляется

Я новый пользователь Python 3.6.0. Я пытаюсь разделить 2 числа, которые дают большой результат. Однако, используя

return ans1 // ans2

производит 55347740058143507128 при использовании

return int(ans1 / ans2)

производит 55347740058143506432.

Что является более точным и почему это так?

2 ответа

Решение

Первый является более точным, поскольку он дает точный целочисленный результат.

Второй представляет промежуточный результат в виде числа с плавающей запятой. Плавания имеют ограниченное разрешение ( 53 бита мантиссы), тогда как для точного представления результата необходимо 66 бит. Это приводит к потере точности.

Если мы посмотрим на шестнадцатеричное представление обоих результатов:

>>> hex(55347740058143507128)
'0x3001aac56864d42b8L'
>>> hex(55347740058143506432)
'0x3001aac56864d4000L'

мы видим, что младшие значащие биты результата, которые не помещались в 53-битную мантиссу, были установлены в ноль.

Один из способов увидеть округление напрямую, без каких-либо осложнений, связанных с делением:

>>> int(float(55347740058143507128))
55347740058143506432L

В этом смысле целочисленное деление полов является более точным.

Проблема с этой конструкцией int(ans1 / ans2), является то, что результатом является временно число с плавающей точкой (перед тем, как, очевидно, преобразовать его в целое число), вводя округление до ближайшего числа с плавающей запятой (величина округления зависит от величины числа). Это можно увидеть, просто попытавшись обойти это значение через число с плавающей запятой:

print(int(float(55347740058143507128)))

Какие отпечатки 55347740058143506432, Итак, потому что просто / в результате получается поплавок, что ограничивает его точность.

Другие вопросы по тегам