计算平方根的分数时的奇怪输出

时间:2016-08-23 16:44:56

标签: python python-3.x math output

我试图找到任何非方数的连续分数(直到它重复)。

例如:输入:23 = [4; 1,3,1,8]

我的代码适用于许多数字(即使它非常笨拙)。 它适用于23输出:

[4, 1, 3, 1, 8, 1, 3, 1]

(忽略额外的1,3,1)

但是当我输入61时它永远不会停止......这里有一行输出:

[7, 1, 4, 3, 1, 2, 2, 1, 3, 4, 1, 14, 1, 4, 3, 1, 2, 2, 1, 4, 5, 1, 6900]

在14之后它不会像它应该重复(4,5而不是3,4和6900不合适)

在编码方面,我有点像菜鸟,所以如果有人能告诉我为什么它不起作用以及我该如何修复它会有很多帮助

这是我的代码:

def find_fractions(n):
    d = math.sqrt(n)
    x = 0
    y = 0
    safeint = 0
    safe = True
    a = ["a", "b", "c", "d"]
    while a[1:int(len(a) / 2)] != a[int(len(a) / 2) + 1:]:
        a.append(math.floor(d))
        d = 1 / (d - math.floor(d))
        print(a)
        safeint += 1
        if safeint > 4 and safe:
            del a[0]
            del a[0]
            del a[0]
            del a[0]
            safe = False
    print(a)

find_fractions(23)

编辑:不是63,意思是61

1 个答案:

答案 0 :(得分:0)

您所拥有的是精确错误。这些计算非常精确,这意味着它们需要许多二进制数字来表示。计算机使用的有限浮点精度有时不足以准确地执行此操作。在某个地方,在您的机器中处理这种不准确性的行为正在破坏您的计算。我使用decimal模块来处理这个大的精度。

import math
from decimal import Decimal
from decimal import getcontext

def find_fractions(n):
    d = Decimal(n).sqrt()
    x = 0
    y = 0
    safeint = 0
    safe = True
    a = ["a", "b", "c", "d"]
    while a[1:int(len(a) / 2)] != a[int(len(a) / 2) + 1:]:
        a.append(math.floor(d))
        d = Decimal(1 / (d - math.floor(d)))
        print(a)
        safeint += 1
        if safeint > 4 and safe:
            del a[0]
            del a[0]
            del a[0]
            del a[0]
            safe = False
    print(a)

这给了我输出 [7, 1, 4, 3, 1, 2, 2, 1, 3, 4, 1, 14, 1, 4, 3, 1, 2, 2, 1, 3, 4, 1] 输入61. Decimal类的默认位数是28.如果需要,可以设置Decimal对象使用更高的精度,如此 getcontext().prec = x

这里是审核浮点精度的Wikipedia page。如果您愿意,我很乐意为您提供一些关于使您的代码更清洁的建议。