Пришел сюда вчера статья по поводу быстрого двойного парсинга я зашел в блог автора и нашел там еще один интересный трюк .
При сравнении чисел с плавающей запятой нужно обращать особое внимание на 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!
Теги: #Высокая производительность #C++ #Ненормальное программирование #ieee 754 #0x5f3759dfinline int64_t to_int64(double x) {
-
На Машине – В Небо
19 Oct, 24 -
Выпуск Mongodb 2.2.0
19 Oct, 24 -
Продавцы На Ebay Повышают Рейтинги
19 Oct, 24