Integer division result too large for a float как исправить

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

С делением через /, действительно, эта ошибка повторяется, но не потому, что он не может делить, а потому, что исходное делимое слишком велико для помещения в 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

такое неровное поведение требует как минимум обсуждения его целесообразности.

Question :

How to manage division of huge numbers in Python?

I have a 100 digit number and I am trying to put all the digits of the number into a list, so that I can perform operations on them. To do this, I am using the following code:

for x in range (0, 1000):
   list[x] = number % 10
   number = number / 10

But the problem I am facing is that I am getting an overflow error something like too large number float/integer. I even tried using following alternative

number = int (number / 10)

How can I divide this huge number with the result back in integer type, that is no floats?

Answer #1:

In Python 3, number / 10 will try to return a float. However, floating point values can’t be of arbitrarily large size in Python and if number is large an OverflowError will be raised.

You can find the maximum that Python floating point values can take on your system using the sys module:

>>> import sys
>>> sys.float_info.max
1.7976931348623157e+308

To get around this limitation, instead use // to get an integer back from the division of the two integers:

number // 10

This will return the int floor value of number / 10 (it does not produce a float). Unlike floats, int values can be as large as you need them to be in Python 3 (within memory limits).

You can now divide the large numbers. For instance, in Python 3:

>>> 2**3000 / 10
OverflowError: integer division result too large for a float

>>> 2**3000 // 10
123023192216111717693155881327...

Answer #2:

If you have an integer and you want each digit in a list, you can use:

>>> map(int,list(str(number)))
[1, 5, 0, 3, 0, 0, 7, 6, 4, 2, 2, 6, 8, 3, 9, 7, 5, 0, 3, 6, 6, 4, 0, 5, 1, 2, 4, 3, 7, 8, 2, 5, 2, 4, 4, 5, 4, 8, 4, 0, 6, 6, 4, 5, 0, 9, 2, 4, 8, 9, 2, 9, 7, 8, 7, 3, 9, 9, 9, 7, 0, 1, 7, 4, 8, 2, 4, 4, 2, 9, 6, 9, 5, 1, 7, 1, 3, 4, 8, 5, 1, 3, 3, 1, 7, 9, 0, 1, 0, 1, 9, 3, 8, 4, 2, 0, 1, 9, 2, 9]

it transform the int into a string, then list will take each character of the string and put it in a list. Finally, map will convert each item of the list into an int again

Answer #3:

Python will automatically handle large ints of arbitrary length. What it won’t do is handle floats of arbitrary length so you need to make sure you’re not getting floats along the way.

Answer #4:

Try int(number) % 10. You can only mod integers.

Answered By: erip

Я решал вопрос программирования, где мне требовалось найти деление с плавающей запятой очень большого числа (10 ^ 100 000) на другое число (10 ^ 5). Однако, когда я импортировал пол из математического модуля, он выдавал ошибку во время выполнения, но когда я попытался сделать то же самое с помощью //, он показал мне результат.

Я хочу знать, почему такая разница? В чем разница между // и math.floor ().

Я новичок и не могу найти материалы по теме.

С помощью

Используя math.floor


>>> import math
>>> math.floor( pow(10,1000) / 1000 )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: integer division result too large for a float

С использованием //

pow(10,1000) // 1000
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

3 ответа

Это потому, что pow(10,1000) / 1000 — это деление с плавающей запятой , а pow(10,1000) // 1000 целочисленное деление .

Как видите, в вашем случае integer division result [is] too large for a float, потому что pow(10,1000) / 1000 пытается создать число с плавающей запятой, но результатом будет 10**997, что не поместится даже в 64-битное число с плавающей запятой. Формат с плавающей запятой двойной точности (также известный как «binary64») имеет фиксированную ширину и позволяет хранить числа до 10**308. Если вы все равно хотите сохранить этот номер, вам нужно будет использовать формат binary80. , которого нет в Python прямо из коробки, и, возможно, он все еще не сможет точно представить результат.

Целочисленное деление в Python отличается, потому что тип int ограничен исключительно вашей оперативной памятью. Например, Python может вычислить целое 10**10000 (которое равно your_huge_number ** 10!) В мгновение ока.


4

ForceBru
11 Июл 2019 в 19:39

pow(10, 1000) возвращает целое число.

pow(10, 1000) / 1000 выдает ошибку, поскольку ему необходимо преобразовать pow(10, 1000) в число с плавающей запятой, что невозможно, поскольку оно слишком велико.

pow(10, 1000) // 1000 выполняет целочисленное деление, которое не требует преобразования в число с плавающей запятой.


1

Jmonsky
11 Июл 2019 в 19:35

OverflowError: integer division result too large for a float

Это говорит вам почти все, что вам нужно знать.

\ — целочисленное деление. Python изначально будет использовать вычисления с большими целыми числами, когда числа становятся очень большими, как в этом вопросе.

Однако pow() возвращает числа с плавающей запятой. Они соответствуют строгому стандарту, определяющему формат в памяти, ограничивая возможный диапазон. Значение, которое вы пытаетесь вычислить, выходит за пределы этого диапазона, отсюда и ошибка.


-1

Baldrickk
11 Июл 2019 в 19:34

Понравилась статья? Поделить с друзьями:
  • Int too large to convert to float питон ошибка
  • Int too large to convert to float как исправить
  • Int object is not subscriptable как исправить
  • Int object is not iterable python ошибка
  • Intel raid web console 3 error code 49 invalid credentials