Этажное деление // 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
, Итак, потому что просто /
в результате получается поплавок, что ограничивает его точность.