进度指示器将PI计算到小数点后

时间:2018-10-26 12:58:39

标签: python progress pi

我已经在python中编写了一些代码来将PI计算为用户指定的小数位数。我使用了Chudnovsky算法,并在以下维基百科上提供了详细信息:https://en.wikipedia.org/wiki/Chudnovsky_algorithm

我相信代码可以正常工作,并为PI返回正确的值。问题在于,当用户指定大量小数位数(例如10,000)时,他或她必须在显示结果之前凝视闪烁的光标很长时间。我想为用户提供某种反馈,以显示计算进度。我已经做到了,但是进度指示器使程序变慢了很多,以致无法使用。

我已经通过以下方式完成了

  1. 我已通过生成器将用户要求的小数位数分成百分之十的步长

    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),代码会慢十倍,但是随着小数位数的增加,它会变得越来越慢。

谢谢

阿德里安

0 个答案:

没有答案