Сортировка значений с плавающей запятой с использованием их байтового представления
Если иметь 8-байтовый раздел данных и записать в него значение с плавающей запятой двойной точности, при каких условиях сравнение путем численного сравнения и лексикографической сортировки байтов согласуется?
Текущая версия: позитивные, тупоконечников
Я считаю, что если число положительно, а представление является Биг-эндианом, то числовое упорядочение значений с плавающей запятой будет соответствовать лексикографическому упорядочению байтов.Идея заключается в том, что сначала это будет сортировка по экспоненте, затем по мантиссе. Даже "денормализованное" представление IEEE не должно вызывать никаких проблем.
Это правда?
(я использую буфер узла :: writeDoubleBE , но это не должно иметь значения.)
Последующие действия
Я думаю, что простая модификация может распространить это на отрицательные числа: XOR все положительные числа с0x8000...
и отрицательные числа с 0xffff...
. Это должно перевернуть знаковый бит на обоих (поэтому сначала идут отрицательные числа), а затем обратный порядок на отрицательных числах. Кто-нибудь видит в этом проблему?1 ответ:
Ваш подход:
Я думаю, что простая модификация может расширить это до отрицательных чисел: XOR все положительные числа с 0x8000... и отрицательные числа с 0xffff.... Это должно перевернуть знаковый бит на обоих (поэтому сначала идут отрицательные числа), а затем изменить порядок на отрицательные числа. Кто-нибудь видит в этом проблему?
- это определенно ответ. Более того, он использовался, например, в dBase и клонах для организации сортировки по столбцу float, а я думаю, за ним следуют новые поколения DB.
Кроме того, он идентичен "полному порядку" согласно IEEE-754 для двоичных представлений. (Но не для десятичных чисел, последнее гораздо сложнее.)
UPDATE: как предлагает @Sneftel: вы можете найти замену -0 на +0, как полезно перед преобразованием в битовую строку.