Быстрое Двойное Сравнение

Пришел сюда вчера статья по поводу быстрого двойного парсинга я зашел в блог автора и нашел там еще один интересный трюк .

При сравнении чисел с плавающей запятой нужно обращать особое внимание на NaN (восемь лет назад я написал подробнее о них); но если сравниваемые числа заведомо не NaN, то их можно сравнивать быстрее процессора! Сравнивать положительные дубли очень легко: нормализация гарантирует, что среди чисел с разными показателями больше то, чей показатель больше, а среди чисел с равным показателем больше то, у которого мантисса больше.

Стандарт IEEE 754 тщательно размещает показатель степени в старших битах, так что положительные двойные числа можно сравнивать просто как int64_t.

Быстрое двойное сравнение

Отрицательные числа немного сложнее: они хранятся в прямой код , пока int64_t находится в дополнительный .

Это означает, что для использования целочисленного сравнения младшие 63 бита double должны быть инвертированы (это приведет к -0. < +0., which does not comply with the standard, but in practice does not pose a problem).

Explicitly checking the most significant bit and conditionally branching would destroy all the benefit of switching to an integer comparison; but there is an easier way!

   

inline int64_t to_int64(double x) {

Теги: #Высокая производительность #C++ #Ненормальное программирование #ieee 754 #0x5f3759df
Вместе с данным постом часто просматривают: