如何在python

时间:2019-02-20 15:22:13

标签: python python-3.x decimal pi

我想用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 我是新来的,所以谢谢您对我的宽容。

2 个答案:

答案 0 :(得分:2)

我对decimal并没有太多的经验,但是您得到的错误是因为不能将**运算符与小数点和浮点数一起使用。解决方案是也将指数设为Decimal,因此您可以dc.Decimal("10005")**(1/2)代替dc.Decimal(10005)**dc.Decimal(1/2)

基本上,您不能合并Decimalsfloats,但是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')