Как сделать десятичные операции в Python - PullRequest
0 голосов
/ 20 февраля 2019

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

import decimal as dc
import math
dc.getcontext().prec = 54
sum1 = 0
for k in range(0, 100):
    a = (-1)**k*(math.factorial(6*k))*(13591409+545140134*k)
    b = (math.factorial(3*k))*(math.factorial(k))**(3)*(640320**(3*k))
    sum1 += a/b

sum1 = sum1/(426880*dc.Decimal("10005")**(1/2))
sum1= sum1**(-1)
print(sum1)

, но он дает

Exception "unhandled TypeError"
unsupported operand type(s) for ** or pow(): 'decimal.Decimal' and 'float'

Я смотрю в Интернете, но не смог найти хороший источник, который охватывает вещи и приводит примеры.Как я могу получить квадратные корни десятичных дробей и если я хочу, чтобы результат типа Decimal и операции были в основном без потерь, как я могу реализовать его в приведенном выше коде?Это python 3.6 Я новичок здесь, поэтому я благодарю вас за терпимость ко мне.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

У меня не слишком много опыта с decimal, но ошибка, которую вы получаете, заключается в том, что вы не можете использовать оператор ** с десятичной дробью и с плавающей точкой.Решение состоит в том, чтобы сделать показатель степени тоже равным Decimal, чтобы вместо dc.Decimal("10005")**(1/2) вы могли сделать dc.Decimal(10005)**dc.Decimal(1/2).

В принципе, вы не можете объединить Decimals и floats, но integersне проблема.Вам нужно быть осторожным, когда вы делите integers, потому что это приведет к floats, поэтому вам также нужно изменить sum1 += a/b на sum1 += dc.Decimal(a)/b.Когда один операнд равен Decimal, результатом также будет Decimal.Все остальные числа в вашей программе в любом случае целые числа, поэтому теперь все должно работать нормально.

0 голосов
/ 20 февраля 2019

Модуль decimal не имеет смысла для использования здесь.Вы используете math.xxxx функции, я цитирую документацию к модулю:

Следующие функции предоставляются этим модулем.За исключением случаев, когда явно указано иное, все возвращаемые значения являются числами с плавающей точкой .

Источник: https://docs.python.org/3/library/math.html

math.factorial - возвращает значение с плавающей точкой

Кроме этого: вы пересчитываете константы:

dc.Decimal("10005")**(1/2) == 5002.5

Нет необходимости пересчитывать его - просто используйте dc.Decimal('5002.5') вместо

...