continued_fraction uses float division, producing invalid terms for large integers and raising OverflowError

Aberta Para iniciantes
#15,655 2 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 2 dias

@trleo já está trabalhando nisso.

Desde 28/10/2026.

Avaliação

Dificuldade
1/5
Tempo estimado
Menos de uma hora
Facilidade para iniciantes
88/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
python
Domínio
tooling

Direção de pesquisa

Abra maths/continued_fraction.py e observe o loop que calcula cada termo: o quociente é obtido com floor(numerator / denominator), que converte para float primeiro. Reproduza com o snippet na issue, substitua essa etapa por divisão inteira com floor para que frações exatas de qualquer tamanho funcionem, e verifique que continued_fraction(Fraction(2**53 + 3)) retorna [9007199254740995] e que o caso 10**400 / 3 não estoura mais. Pronto significa que ambos os exemplos se comportam corretamente e que frações negativas ainda dão uma fração contínua correta.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Repository commit

6e03a48579ca212a08b36be00378f887dc41a003

Python version (python --version)

Python 3.11.0, macOS

Dependencies version (pip freeze)

The reproduction uses only Python's standard library; no third-party dependencies are involved.

Expected behavior

continued_fraction(Fraction(2**53 + 3)) should return [9007199254740995], the continued fraction of that integer. Large exact fractions should not fail merely because they exceed floating-point range.

Actual behavior

Run from the repository root:

from fractions import Fraction
from maths.continued_fraction import continued_fraction

print(continued_fraction(Fraction(2**53 + 3)))
try:
    print(continued_fraction(Fraction(10**400, 3)))
except OverflowError as exc:
    print(type(exc).__name__ + ':', exc)

Output:

[9007199254740996, -1]
OverflowError: integer division result too large for a float

The first result represents the same integer numerically, but is not the regular continued fraction: the trailing term is negative because the first quotient was rounded upward.

In maths/continued_fraction.py, floor(numerator / denominator) first converts the integer ratio to a float. This loses precision for sufficiently large values and can overflow. Computing the quotient directly with integer floor division (numerator // denominator) preserves exact arithmetic and also handles negative fractions.

I searched existing issues and PRs for continued fraction and continued_fraction; I did not find an existing report of this problem.

Linguagem predominante
Python
Estrelas
226k
Forks
51.3k
Merge médio
1d 13h
PRs com merge (30d)
32

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de TheAlgorithms/Python

Todas as issues de TheAlgorithms/Python

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.