我想用chudnowsky算法计算π,我希望它精确,所以
我试着用十进制模块,但我不明白我怎么能用它。
代码是
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'
我看了网上,但找不到一个好的来源,涵盖的东西,并给出了例子。如果我想要一个十进制类型的结果,并且操作基本上是无损的,我如何实现上面的代码呢?它的python3.6 我是新来的,所以我感谢你对我的宽容。你知道吗
我对
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
。程序中的所有其他数字都是整数,所以现在应该可以正常工作了。你知道吗在这里使用模块
decimal
没有意义。您正在使用math.xxxx
函数,我引用模块文档:资料来源:https://docs.python.org/3/library/math.html
math.factorial-返回float
除此之外:重新计算常量:
无需重新计算-只需使用
dc.Decimal('5002.5')
相关问题 更多 >
编程相关推荐