我已经在python中编写了一些代码来将PI计算为用户指定的小数位数。我使用了Chudnovsky算法,并在以下维基百科上提供了详细信息:https://en.wikipedia.org/wiki/Chudnovsky_algorithm。
我相信代码可以正常工作,并为PI返回正确的值。问题在于,当用户指定大量小数位数(例如10,000)时,他或她必须在显示结果之前凝视闪烁的光标很长时间。我想为用户提供某种反馈,以显示计算进度。我已经做到了,但是进度指示器使程序变慢了很多,以致无法使用。
我已经通过以下方式完成了
我已通过生成器将用户要求的小数位数分成百分之十的步长
def ten_percent(places):
for i in range(int(places/10),int(places+1),int(places/10)):
yield i
precision_step = ten_percent(places)
precision_check = next(precision_step)
然后我有一个非常笨拙的声明,以查看我的PI计算准确到多少个地方
try:
test_num = abs(round(np.log10(abs(decimal.Decimal(next_pi -
current_pi)))))
except:
pass
首先,我尝试一下,但因为在某个点上,连续PI计算之间的差异变得如此之小,以至于它返回“ Infinity”而不是整数。 next_pi和current_pi是连续的计算或迭代。 使用decimal.Decimal,因为可以包含1000的小数位。 abs得到一个正数; np是NumPy,用于将A乘以10的指数乘以幂。 abs给出一个正数
我认为上面的陈述是我的问题,并且我认为计算“ log10”花费了太多时间。
然后我有这个代码
if test_num >= precision_check:
print('Calculation steps: ' + str(counter-1) + ' Approximate decimal
places: ' + str(precision_check))
if precision_check < places:
precision_check = next(precision_step)
变量test_num实际上是我当前用于PI计算的小数位数。 变量precision_check是用户请求的小数位数后的百分之十。 (基本上,我想在计算的小数点后百分之十处给出反馈。) 提供反馈后,我将增加到下一个百分之十的值。
此反馈系统可以工作,但会使代码慢得多。对于小数位数(例如100),代码会慢十倍,但是随着小数位数的增加,它会变得越来越慢。
谢谢
阿德里安