Почему -инф при вычислении выражения, которое контролируется - PullRequest
1 голос
/ 01 апреля 2020

Я делаю вычисление со значениями переменных:

b=49277625229919252619702799653707265870395898977145078030839752

n=22112825529529666435281085255026230927612089502470015394413748319128822941402001986512729726569746599085900330031400051170742204560859276357953757185954298838958709229238491006703034124620545784566413664540684214361293017694020846391065875914794251435144458199

c=-3.2029790664620333e+67

, и вычисляемое мной значение:

B = (b + (n - b*b) * c)

Это возвращает -inf, что не должно быть, учитывая, что Я не ограничен объемом памяти (у меня есть более 10 концертов, где я делаю это).

Исправлена ​​ли эта проблема?

Редактировать: Я также хотел бы знать причину, по которой это происходит, чтобы я мог избежать будущих неудач.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2020

Ваша операция возвращает -inf, поскольку она превышает предел float. Вы можете использовать sys.float_info.max для проверки максимального значения с плавающей запятой, поддерживаемого реализацией. Обычно это значение 1.7976931348623157e+308. Таким образом, числа выше этого предела будут представлены как float('inf'), если положительный, или float('-inf'), если отрицательный.

Теперь, чтобы решить вашу проблему, вы можете использовать встроенный decimal библиотека в python.

Попробуйте это:

from decimal import Decimal

b = Decimal(b)
n = Decimal(n)
c = Decimal(c)

B = (b + (n - b*b) * c)
print(B)

Вывод:

-7.082691727141074913216311547E+326
2 голосов
/ 01 апреля 2020

Другое решение может быть сделано с использованием библиотеки mpmath, которая является библиотекой с произвольной точностью

from mpmath import mp, mpf

# set 50 decimal point precision
mp.dps = 50

#...
b=mpf(b)
n=mpf(n)
c=mpf(c)
B = mp((b + (n - b*b) * c))

Вывод:

mpf('-7.0826917271410749132163115458418859131992983363200556e+326')
...