Я пытаюсь сделать continued fraction derivation иррациональных чисел, например. sqrt (13), с Python. Я получил довольно хорошее решение, которое является точным в течение первых 10 или около того итераций:Работа с повышенной точностью иррациональных чисел в python
- Установите оригинальный номер в качестве текущего остатка
- Append пола текущего остатка к списку коэффициентов
- Определить новый остаток как взаимный ток остатка минус пол
- Перейти к шагу 2, если новый остаток не 0
Это работает очень хорошо, для последующих итераций, гдекроме Точностьпорождает ошибочные коэффициенты. Как только один коэффициент выключен, остальные будут автоматически также.
Мой вопрос, поэтому, если есть способ лечения иррациональных чисел, например. sqrt (13), например, заполнители (для последующей замены) или более точно?
Мой текущий код, как показано ниже:
import math
def continued_fraction(x, upper_limit=30):
a = []
# should in fact iterate until repetitive cycle is found
for i in range(upper_limit):
a.append(int(x))
x = 1.0/(x - a[-1])
return a
if __name__ == '__main__':
print continued_fraction(math.sqrt(13))
С результатом выхода:
[3, 1, 1, 1, 1, 6,
1, 1, 1, 1, 6,
1, 1, 1, 1, 6,
1, 1, 1, 1, 6,
1, 1, 1, 1, 7, 2, 1, 4, 2]
И я знаю, за то, что полученный результат должен быть 3, а затем бесконечных повторений цикл (1, 1, 1, 1, 6), согласно Project Euler Problem 64 (который я пытаюсь решить).
Вы можете попробовать класс 'Десятичный' из модуля' decimal' – slezica
@slezica Спасибо. Это помогает совсем немного, но ошибки все же происходят, начиная с коэффициентов ~ 15-30 изредка. –