【问题标题】:Weird output when calculating fractions of a square root计算平方根的分数时的奇怪输出
【发布时间】:2016-08-23 16:44:56
【问题描述】:

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

例如:输入: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

【问题讨论】:

  • 您能否提供您想要达到的目标的一般数学描述?
  • 63 对我来说很好,导致[7, 1, 14, 1, 14, 1, 14, 1]。对于 64,它给出 ZeroDivisionError
  • 基本上我在关注这个:math.stackexchange.com/questions/265690/… 并试图找到任何非平方数的连分数
  • @vsminkov 它适用于任何重复序列不那么长的数字(如果有意义的话),但不适用于 fx、61 或 109。另外 64 不起作用的原因是因为它是一个完美的正方形

标签: python python-3.x math output


【解决方案1】:

您所拥有的是精度错误。这些计算非常精确,这意味着它们需要许多二进制数字来表示。您的计算机使用的有限浮点精度有时不足以准确地做到这一点。在某个地方,在您的机器中如何处理这种不准确性的行为正在破坏您的计算。我使用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 来检查浮点精度。如果您愿意,我很乐意为您提供一些关于使您的代码更清晰的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-29
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多