计算squ分数时的奇怪输出

2024-04-19 14:53:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到任何非平方数的连分数(直到它重复)。你知道吗

例如:输入: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不合适)

我是一个有点noob当谈到编码,所以它会有很大帮助,如果有人能告诉我为什么它不工作,我应该如何修复它

这是我的密码:

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


Tags: 代码密码编码len数字mathfindsafe
1条回答
网友
1楼 · 发布于 2024-04-19 14:53:55

你得到的是一个精度误差。这些计算非常精确,这意味着它们需要许多二进制数字来表示。您的计算机使用的有限浮点精度有时不足以精确地执行此操作。在这条线上的某个地方,你的机器如何处理这种不准确的行为打破了你的计算。我使用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来检查浮点精度。如果你愿意,我很乐意给你一些建议,让你的代码更干净。你知道吗

相关问题 更多 >