Я делаю https://projecteuler.net/problem=57, где получаю числитель и знаменатель и если числитель длиннее знаменателя, я добавляю единицу к общей сумме.

Однако в какой-то момент (выше n = 805) числитель и знаменатель становятся настолько большими, что python преобразует их в бесконечность. Вот мой код, если вы хотите его протестировать.

def sqrt_2(max_iteration, total = 0, previous_numerator = 1, previous_denominator = 2, iteration = 1):
    
    numerator_test = previous_numerator + previous_denominator
    denominator_test = previous_denominator
    print(numerator_test, denominator_test, numerator_test / denominator_test)
    if len(str(numerator_test)) > len(str(denominator_test)):
        total += 1
    
    if iteration == max_iteration:
        return total
    
    next_value_numerator = 1 * previous_denominator
    next_value_denominator = int(( 2 + (previous_numerator / previous_denominator) ) * previous_denominator)
    
    return sqrt_2(max_iteration, total, next_value_numerator, next_value_denominator, iteration + 1)
            


print("\n", sqrt_2(806))

Есть ли способ увеличить этот предел бесконечности? 806 действительно довольно близко к 1000. Если это имеет какое-либо отношение к версии IDE / Python, я использую Spyder 5.0 и python 3.7.

Заранее спасибо!

1
ZeusBeer 2 Май 2021 в 22:43

1 ответ

Лучший ответ

Здесь нельзя использовать арифметику с плавающей запятой. Плавающая точка поддерживает ограниченное количество значащих цифр (17 или около того). Когда код делит числа, результатом является число с плавающей запятой, и очень скоро (итерация 25 или что-то подобное) будет недостаточно точности, чтобы представить его как float.

На самом деле происходит то, что ваши числа становятся такими большими, что float не может даже представлять свою экспоненту и стремится к бесконечности. Но это не должно иметь значения, потому что цифры неверны задолго до того, как они переполнятся.

Что вам нужно, так это алгоритм, который вычисляет числитель и знаменатель, используя только целочисленные операции (например, сложение и умножение), без деления.

4
anatolyg 2 Май 2021 в 20:28