为什么我的程序 "stopped" 有效?
Why has my program "stopped" working?
我在 Python 3.3.2 中编写了一个计算圆周率的程序(只是为了好玩,我不想使用内置的圆周率)。它工作正常 - 它获得了小数点后 7 位的 pi 的正确值。然而,一旦到达这一点,程序将继续,但值不会改变。我试过使用 decimal.Decimal,但它不起作用 - 它出现以下错误:
TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'
这是我的工作代码(使用浮点数而不是小数。)我只包含了实际的算法:
pi=float(3)
a=2
b=0
c=float(0)
while 1==1:
b=a*(a+1)*(a+2)
c=4/b
pi=pi+c
print(str(pi))
a=a+2
b=a*(a+1)*(a+2)
c=4/b
pi=pi-c
print(str(pi))
a=a+2
这是结果:
http://i.imgur.com/y0qgBMB.png(抱歉,我没有足够的声誉直接 post 图片)
请注意,该程序实际上比这早得多停止工作,我只是把它放在那里一会儿。
我知道我使用的算法能够找到更多小数位的圆周率,所以有人可以告诉我为什么它不起作用,并给我任何可能的解决方案吗?
正如您可能从我的代码的简单性中注意到的那样,我不太擅长 python - 只有我在学校教授的基本知识。简单的解决方案将不胜感激!
编辑
这是带有 Decimal 的非工作代码,其中包含 Jasper 的建议。
import decimal
pi=decimal.Decimal(3)
a=2
b=0
c=decimal.Decimal(0)
while True:
b=a*(a+1)*(a+2)
c=4/b
pi=pi+c
print(str(pi))
a=a+2
b=a*(a+1)*(a+2)
c=4/b
pi=pi-c
print(str(pi))
a=a+2
这是错误:
Traceback (most recent call last):
File "C:\Users...\fastpi2.py", line 9, in
pi=pi+c TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'
您的代码失败,因为两个整数相除得到一个浮点数(在 Python 3 中):
>>> from decimal import Decimal
>>> pi = Decimal(3)
>>> a=2
>>> b=a * (a+1) * (a+2)
>>> c=4/b
>>> type(c)
<class 'float'>
>>> pi = pi + c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'Decimal' and 'float'
以下作品:
>>> a = Decimal(2)
>>> one = Decimal(1)
>>> b = a * (a+one) * (a+one+one)
>>> c = Decimal(4) / b
>>> type(c)
<class 'decimal.Decimal'>
>>> pi = pi + c
>>> pi
Decimal('3.166666666666666666666666667')
我在 Python 3.3.2 中编写了一个计算圆周率的程序(只是为了好玩,我不想使用内置的圆周率)。它工作正常 - 它获得了小数点后 7 位的 pi 的正确值。然而,一旦到达这一点,程序将继续,但值不会改变。我试过使用 decimal.Decimal,但它不起作用 - 它出现以下错误:
TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'
这是我的工作代码(使用浮点数而不是小数。)我只包含了实际的算法:
pi=float(3)
a=2
b=0
c=float(0)
while 1==1:
b=a*(a+1)*(a+2)
c=4/b
pi=pi+c
print(str(pi))
a=a+2
b=a*(a+1)*(a+2)
c=4/b
pi=pi-c
print(str(pi))
a=a+2
这是结果: http://i.imgur.com/y0qgBMB.png(抱歉,我没有足够的声誉直接 post 图片)
请注意,该程序实际上比这早得多停止工作,我只是把它放在那里一会儿。
我知道我使用的算法能够找到更多小数位的圆周率,所以有人可以告诉我为什么它不起作用,并给我任何可能的解决方案吗?
正如您可能从我的代码的简单性中注意到的那样,我不太擅长 python - 只有我在学校教授的基本知识。简单的解决方案将不胜感激!
编辑
这是带有 Decimal 的非工作代码,其中包含 Jasper 的建议。
import decimal
pi=decimal.Decimal(3)
a=2
b=0
c=decimal.Decimal(0)
while True:
b=a*(a+1)*(a+2)
c=4/b
pi=pi+c
print(str(pi))
a=a+2
b=a*(a+1)*(a+2)
c=4/b
pi=pi-c
print(str(pi))
a=a+2
这是错误:
Traceback (most recent call last): File "C:\Users...\fastpi2.py", line 9, in pi=pi+c TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'
您的代码失败,因为两个整数相除得到一个浮点数(在 Python 3 中):
>>> from decimal import Decimal
>>> pi = Decimal(3)
>>> a=2
>>> b=a * (a+1) * (a+2)
>>> c=4/b
>>> type(c)
<class 'float'>
>>> pi = pi + c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'Decimal' and 'float'
以下作品:
>>> a = Decimal(2)
>>> one = Decimal(1)
>>> b = a * (a+one) * (a+one+one)
>>> c = Decimal(4) / b
>>> type(c)
<class 'decimal.Decimal'>
>>> pi = pi + c
>>> pi
Decimal('3.166666666666666666666666667')