在python中使用更高的无理数精度

时间:2016-10-14 20:35:12

标签: python precision

我正在尝试continued fraction derivation无理数,例如sqrt(13),Python。我已经获得了一个非常好的解决方案,对于前10次左右的迭代是准确的:

  1. 将原始号码设为当前余数
  2. 将当前余数的下限附加到系数列表
  3. 将新余数定义为当前余数减去楼层的倒数
  4. 转到第2步,除非新余数为0
  5. 除了后来的迭代之外,这种方法非常有效,float精度会产生错误的系数。关闭单个系数后,其余系数也将自动生效。

    因此,我的问题是,是否有办法处理无理数,例如sqrt(13),像占位符(以后替换)或更精确的方式?

    我目前的代码如下:

    import math
    
    
    def continued_fraction(x, upper_limit=30):
        a = []
        # should in fact iterate until repetitive cycle is found 
        for i in range(upper_limit):
            a.append(int(x))
            x = 1.0/(x - a[-1])
        return a
    
    
    if __name__ == '__main__':
        print continued_fraction(math.sqrt(13))
    

    结果输出:

    [3, 1, 1, 1, 1, 6, 
        1, 1, 1, 1, 6, 
        1, 1, 1, 1, 6, 
        1, 1, 1, 1, 6, 
        1, 1, 1, 1, 7, 2, 1, 4, 2]
    

    我知道一个事实,结果输出应该是3,然后按照Project Euler Problem 64(我{&#39}}无限重复循环(1,1,1,1,6)。我试图解决。)

3 个答案:

答案 0 :(得分:2)

我不知道Python中有任何这样的占位符。

但是,您可以考虑使用decimal.Decimal来增加数学运算的精度,但绝不会保证无限次重复循环。为什么? Is floating point math broken?

对您的代码进行以下修改可为if(moment($scope.nextDate).isSame(moment(), 'day')){ $scope.daysCountdown = 0; } else { $scope.daysCountdown = moment($scope.nextDate).format('D'); } 之前的运行提供正确的结果:

upper_limit=45

答案 1 :(得分:1)

您可能会关注https://rosettacode.org/wiki/Continued_fraction#Python。它使用Fractions和Itertools模块。

答案 2 :(得分:1)

显然Marius Becceanu发布了an algorithm for the specific continued fraction of sqrt(n),这是迭代的,非常好。该算法不需要使用任何浮点。