Сортировка значений с плавающей запятой с использованием их байтового представления


Если иметь 8-байтовый раздел данных и записать в него значение с плавающей запятой двойной точности, при каких условиях сравнение путем численного сравнения и лексикографической сортировки байтов согласуется?

Текущая версия: позитивные, тупоконечников

Я считаю, что если число положительно, а представление является Биг-эндианом, то числовое упорядочение значений с плавающей запятой будет соответствовать лексикографическому упорядочению байтов.

Идея заключается в том, что сначала это будет сортировка по экспоненте, затем по мантиссе. Даже "денормализованное" представление IEEE не должно вызывать никаких проблем.

Это правда?

(я использую буфер узла :: writeDoubleBE , но это не должно иметь значения.)

Последующие действия

Я думаю, что простая модификация может распространить это на отрицательные числа: XOR все положительные числа с 0x8000... и отрицательные числа с 0xffff.... Это должно перевернуть знаковый бит на обоих (поэтому сначала идут отрицательные числа), а затем обратный порядок на отрицательных числах. Кто-нибудь видит в этом проблему?
1 3

1 ответ:

Ваш подход:

Я думаю, что простая модификация может расширить это до отрицательных чисел: XOR все положительные числа с 0x8000... и отрицательные числа с 0xffff.... Это должно перевернуть знаковый бит на обоих (поэтому сначала идут отрицательные числа), а затем изменить порядок на отрицательные числа. Кто-нибудь видит в этом проблему?

- это определенно ответ. Более того, он использовался, например, в dBase и клонах для организации сортировки по столбцу float, а я думаю, за ним следуют новые поколения DB.

Кроме того, он идентичен "полному порядку" согласно IEEE-754 для двоичных представлений. (Но не для десятичных чисел, последнее гораздо сложнее.)

UPDATE: как предлагает @Sneftel: вы можете найти замену -0 на +0, как полезно перед преобразованием в битовую строку.