(←) предыдущая запись ; следующая запись (→)

Всё потому что алгоритм полагается на некоторые аксиомы линейного порядка для отношения сравнения <, которые приняты в математике. В частности, обычно считается, отношение что отношение < – иррефлексивно, т.е. 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»).
И вот из-за этого небольшого дополнения половина условных операторов в вашем коде работает не совсем так, как вы ожидаете.

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