Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Как разделить гигантское число на python3?

#python #python_3x #float #большие_числа #int


Работаю с большими числами, необходимо разделить int типа этого

4858450636189713423582095962494202044581400587983244549483093085061934704708809928450644769865524364849997247024915119110411605739177407856919754326571855442057210445735883681829823754139634338225199452191651284348332905131193199953502413758765239264874613394906870130562295813219481113685339535565290850023875092856892694555974281546386510730049106723058933586052544096664351265349363643957125565695936815184334857605266940161251266951421550539554519153785457525756590740540157929001765967965480064427829131488548259914721248506352686630476300


на 17

получаю ошибку:

OverflowError: integer division result too large for a float


Целочисленное деление тоже ведёт к этой ошибке.

Как на питоне разделить такое число? (на результате достаточно целого числа)
    


Ответы

Ответ 1



С делением через /, действительно, эта ошибка повторяется, но не потому, что он не может делить, а потому, что исходное делимое слишком велико для помещения в double (даже с неизбежной погрешностью), а при / оба числа конвертируются в double (в Python - float) перед собственно делением. Вызвать float() на него тоже даёт ту же ошибку. С делением нацело - знак // - проблем нет, результат возвращается и корректный: >>> 4858450636189713423582095962494202044581400587983244549483093085061934704708809928450644769865524364849997247024915119110411605739177407856919754326571855442057210445735883681829823754139634338225199452191651284348332905131193199953502413758765239264874613394906870130562295813219481113685339535565290850023875092856892694555974281546386510730049106723058933586052544096664351265349363643957125565695936815184334857605266940161251266951421550539554519153785457525756590740540157929001765967965480064427829131488548259914721248506352686630476300//3 1619483545396571141194031987498067348193800195994414849827697695020644901569603309483548256621841454949999082341638373036803868579725802618973251442190618480685736815245294560609941251379878112741733150730550428116110968377064399984500804586255079754958204464968956710187431937739827037895113178521763616674625030952297564851991427182128836910016368907686311195350848032221450421783121214652375188565312271728111619201755646720417088983807183513184839717928485841918863580180052643000588655988493354809276377162849419971573749502117562210158766 Если у вас деление нацело тоже не работает - возможно, у вас как-то очень странно скомпилирован сам Python. В таком случае, вам следует рассмотреть смену версии и/или поставщика. Я проверял оба случая на Python 3.6 под Ubuntu 18.04/x86_64 и Python 3.7 на FreeBSD/i386, так что обычные проблемы 32/64 явно не влияют. Windows под рукой нет, может быть, её странности недостаточно отражены в коде интерпретатора (например, то, что long в 64-битном режиме - 32 бита, противоречит не только устоявшимся традициям всех остальных, но и собственной же .NET). P.S. Тут есть вопрос, который, возможно, требует жалобы на баг: >>> float(4858450636189713423582095962494202044581400587983244549483093085061934704708809928450644769865524364849997247024915119110411605739177407856919754326571855442057210445735883681829823754139634338225199452191651284348332905131193199953502413758765239264874613394906870130562295813219481113685339535565290850023875092856892694555974281546386510730049106723058933586052544096664351265349363643957125565695936815184334857605266940161251266951421550539554519153785457525756590740540157929001765967965480064427829131488548259914721248506352686630476300) Traceback (most recent call last): File "", line 1, in OverflowError: int too large to convert to float >>> float('1e+308') 1e+308 >>> float('1e+309') inf >>> float('4858450636189713423582095962494202044581400587983244549483093085061934704708809928450644769865524364849997247024915119110411605739177407856919754326571855442057210445735883681829823754139634338225199452191651284348332905131193199953502413758765239264874613394906870130562295813219481113685339535565290850023875092856892694555974281546386510730049106723058933586052544096664351265349363643957125565695936815184334857605266940161251266951421550539554519153785457525756590740540157929001765967965480064427829131488548259914721248506352686630476300') inf такое неровное поведение требует как минимум обсуждения его целесообразности.

Ответ 2



Используйте оператор целочисленного деления x // 3 Или Decimal Decimal(x) / Decimal(3)

Комментариев нет:

Отправить комментарий