Q:

Возможно ли переполнение при вычитании в компараторе?

Рассмотрим сортировку, у которой в компараторе в качестве результата используется разность сравниваемых элементов
a.sort((x, y) => x-y)

Очевидно, что при целочисленных типах данных этот алгоритм подвержен переполнению, приводящему к неверному результату. Такой пример довольно лекго составить:

console.log([1<<31, 1].sort((x, y) => x-y|0))

А как насчёт вещественных чисел? Подвержены ли они проблеме переполнения?
Я могу придумать пример, где разность двух Infinity даёт NaN, но не могу придумать ситуацию, в которой это бы сказалось на сортировке - ведь все бесконечности равны, а разности с другими значениями поставят их на нужное место.

console.log([Infinity, 1, -Infinity, Infinity].sort((x, y) => x-y))

A:

Представление целых чисел со знаком имеет зацикленную структуру за счет использования "дополнительного кода" для представления отрицательных значений. Это и является причиной того, что выполняя вроде бы обычное сложение двух целых чисел можно получить отрицательное число, если нет контроля переполнений, тоже касается сложения двух отрицательных.
В представлении вещественных чисел (IEEE 754) цикличность отсутствует, знак числа хранится отдельным битом. Зато присутствует два нуля (+0, -0), собственно чтобы их не было и вводили дополнительный код в представлении целых. Переполнение мантиссы не возможно, т.к. из мантиссы вытесняются лишние младшие биты после вычисления порядка результата. Порядок хранится как целое без знака и его максимальное значение обрабатывается особым образом, поэтому вместо переполнения получаются либо бесконечности, либо NaN.
Таким образом сам формат вещественных чисел (IEEE 754) не допускает ошибки переполнения при выполнении стандартных арифметических операций.

