我想用chudnowsky算法来计算pi,所以我希望它很精确
我尝试使用Decimal模块,但无法理解如何使用它。
代码是
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 我是新来的,所以谢谢您对我的宽容。
答案 0 :(得分:2)
我对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
。程序中的所有其他数字无论如何都是整数,所以现在应该可以正常工作了。
答案 1 :(得分:1)
模块decimal
在这里没有意义。您正在使用math.xxxx
函数,我引用了模块文档:
此模块提供以下功能。除非另有明确说明,否则所有返回值都是浮点数。
来源:https://docs.python.org/3/library/math.html
math.factorial-返回浮点数
除此之外:您需要重新计算常量:
dc.Decimal("10005")**(1/2) == 5002.5
无需重新计算-只需使用dc.Decimal('5002.5')