(←) предыдущая запись ; следующая запись (→)
Всё потому что алгоритм полагается на некоторые аксиомы линейного порядка для отношения сравнения <
, которые приняты в математике. В частности, обычно считается, отношение что отношение <
– иррефлексивно, т.е. x < x
неверно ни для какого x
– транзитивно, т.е. из того, что x < y
и y < z
следует что x < z
– полное, т.е. для каждой пары значений x, y выполняется одно из трёх условий: x < y
, y < x
или x == y
. Вообще говоря, бывают множества, где некоторые элементы можно упорядочить, а другие пары элементов несравнимы.
Стандарт вещественных чисел ослабляет эту аксиоматику. Так IEEE-754 включает в вещественные числа значения +/-Infinity и NaN. И считает, что с ними «полный порядок». В смысле, отношение сравнения полное, т.е. определено на каждой паре чисел.
Вот только в стандарте есть четыре основаных предиката: less_than(x, y), equal(x, y), greater_than(x, y), unordered(x, y)
. И если оказалось, что неверно ни x < y
, ни y < x
, ещё рано делать вывод, что x == y
. Вполне возможно, что x ? y
(читается как «x
неупорядочен с y
»).
И вот из-за этого небольшого дополнения половина условных операторов в вашем коде работает не совсем так, как вы ожидаете.
На всякий случай отмечу, что я нисколько не ругаю стандарт. Во-первых, я его почти не знаю. Во-вторых, у них были и другие не менее важные соображения, с которыми приходилось считаться.