跳到内容
🛠️ToolsShed

连分数计算器

将小数或分数转换为连分数表示和收敛分数。

关于此工具

连分数是一种数学表示法,可将任意实数表示为嵌套除法的数列。与标准十进制表示法不同,连分数揭示了数字的基础算术结构,并提供逐步改进的有理近似。该工具可将您的输入(无论是3.14159这样的十进制数,还是355/113这样的分数)转换为连分数形式,让您轻松了解数学家如何历史性地发现了对无理数常数的显著精确的有理近似。

使用此计算器很简单:输入您的十进制数或分子/分母形式的分数,然后指定要计算多少项。该工具以[a₀; a₁, a₂, ...]形式显示连分数表示法,并生成收敛分数表——逐步以不断提高的精度接近原始数字的分数序列。每个收敛分数相对于其分母大小提供了最优的有理近似,这一特性在导航系统、天文计算和音乐调律中被广泛利用。

连分数在数论和密码学中尤其有价值,其中对无理数的高效近似可以揭示微妙的数学性质。对于某些无理数(如2的平方根)出现的周期性模式揭示了与代数和几何的深层联系。无论您是在探索纯粹数学、验证工程近似还是只是好奇为什么355/113如此精确地近似π,此工具都将抽象的连分数理论转化为可视化、交互式的计算。

常见问题

代码实现

import math

def continued_fraction(x: float, max_terms: int = 20) -> list[int]:
    """Compute continued fraction representation of x"""
    terms = []
    remaining = x
    for _ in range(max_terms):
        a = int(math.floor(remaining))
        terms.append(a)
        frac = remaining - a
        if abs(frac) < 1e-10:
            break
        remaining = 1 / frac
        if not math.isfinite(remaining):
            break
    return terms

def convergents(terms: list[int]) -> list[tuple[int, int]]:
    """Compute convergents (rational approximations) from continued fraction terms"""
    conv = []
    h_prev, h_curr = 1, terms[0]
    k_prev, k_curr = 0, 1
    conv.append((h_curr, k_curr))

    for i in range(1, len(terms)):
        a = terms[i]
        h_next = a * h_curr + h_prev
        k_next = a * k_curr + k_prev
        h_prev, h_curr = h_curr, h_next
        k_prev, k_curr = k_curr, k_next
        conv.append((h_curr, k_curr))
    return conv

# Example: pi
pi_terms = continued_fraction(math.pi, 10)
print(f"pi = [{pi_terms[0]}; {', '.join(map(str, pi_terms[1:]))}]")

for num, den in convergents(pi_terms):
    approx = num / den
    error = abs(approx - math.pi)
    print(f"  {num}/{den} = {approx:.10f}  (error: {error:.2e})")

# Golden ratio
phi = (1 + math.sqrt(5)) / 2
print(f"phi terms: {continued_fraction(phi, 8)}")  # All ones!

# sqrt(2)
sqrt2_terms = continued_fraction(math.sqrt(2), 8)
print(f"sqrt(2) terms: {sqrt2_terms}")  # [1; 2, 2, 2, ...]

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.