почему // (этаж подразделения) выдает результат, а math.floor () выдает OverflowError - PullRequest
0 голосов
/ 11 июля 2019

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

Я хочу знать, почему такая разница? В чем разница между // и 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 ]

4 голосов
/ 11 июля 2019

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

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

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

1 голос
/ 11 июля 2019

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

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

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

0 голосов
/ 11 июля 2019
OverflowError: integer division result too large for a float

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

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

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

...