Арифметика с плавающей запятой: возможная небезопасная зависимость от конкретных сравнение?

Следующий код Python вычисляет количество итераций для выполнения каких-либо действий на основе некоторых переменных.

  # a - b - c is always a multiple of d.
  i = (a - b - c) / d
  while i:
    # do stuff
    i -= 1

Все переменные будут одного типа, то есть только ints или float или что-то еще. Меня беспокоит, будет ли он работать правильно, если значения равны float . Я знаю достаточно, чтобы всегда учитывать подводные камни, полагаясь на точные значения с плавающей запятой. Но я не могу сказать, опасно это или нет. Я могу использовать i = int (round ((a - b - c) / d)) , но мне любопытно лучше понять числа с плавающей запятой.

Все сводится к следующему: a - b - c является точным кратным d . Поэтому я полагаюсь на (abc) / d , чтобы стать значением i , из которого я могу вычесть 1 и получить ожидаемое количество итераций в цикле while. , с подразумеваемым предположением, что i == 0 становится истинным. То есть, можно ли уменьшать такие вычисленные кратные на 1, чтобы достичь ровно 0?

Я хотел бы не только знать, небезопасно ли это, но, что более важно, что мне нужно понимать о плавающей запятой, чтобы решить такой вопрос, как это? Если кто-то точно знает, безопасно это или нет, можно ли объяснить, как так?

5
задан porgarmingduod 15 January 2012 в 13:53
поделиться