2

Программа определяет, является ли последовательность геометрической или алгебраической. Всё работает, но лишь до того момента, пока все элементы в списке не станут типа float, в таком случае проверка на алгебраическую начинает работать неверно. Пример: 1.1 2.2 3.3 4.4 – алгебраическая прогрессия с отношением 1.1, но ф-я возвращает False.

sequence = str(input('Введите последовательность чисел: '))
lst = [float(i) for i in sequence.split()]

def is_geometric(lt): ratio = lt[1] / lt[0]

for i in range(1, len(lt)):

    if lt[i] / lt[i-1] != ratio:
        return is_algeb(lt)

return f'Данная последовательность является геометрической. Её отношение равно {ratio}'


def is_algeb(lt): ratio = lt[1] - lt[0]

for i in range(1, len(lt)):

    if lt[i] - lt[i-1] != ratio:
        return 'Данный набор чисел не является последовательностью'

return f'Данная последовательность является алгебраической. Её отношение равно {ratio}'


print(is_geometric(lst))

работа программы

EF1M
  • 39
  • 7
  • 1
    4.4 - 3.3 = 1.1000000000000005, а 3.3-2.2 =1.0999999999999996 – Эникейщик Oct 08 '21 at 08:53
  • 1
    ну и хороший способ находить ошибки - выводить на печать промежуточные значения. Добавив (например) print(lt[i] - lt[i-1]) в цикл, вы бы уже поняли причину неверного результата. – Эникейщик Oct 08 '21 at 08:55

2 Answers2

5

Вам нужно либо сравнивать числа учитывая погрешность, либо использовать тип данных Decimal, хранящий числа с абсолютной точностью.

Scrzii
  • 186
  • 8
  • 2
    Decimal - хороший совет, если у автора вопроса входные данные всегда будут точно представимы через десятичные дроби. Иначе можно посмотреть в сторону Fraction, который позволяет работать с любыми дробями вообще. – Xander Oct 08 '21 at 10:13
4

Сравнение чисел с плавающей запятой "в лоб" не работают из-за машинного представления числа. Используйте соответствующую функцию для этого.

        if not math.isclose(lt[i] - lt[i-1], ratio):
GrAnd
  • 13,501