Сериализация с плавающей точкой, лексикографическое сравнение == сравнение с плавающей точкой
Я ищу способ сериализации с плавающей запятой, чтобы в их сериализованной форме лексикографическое сравнение было таким же, как сравнение с плавающей запятой. Я думаю, что это возможно, сохранив его в виде:
| signed bit (1 for positive) | exponent | significand |
Экспонента и значение будут сериализованы как big-endian, а дополнение будет взято для отрицательных чисел.
Будет ли это работать? Я не против, если это сломается для NaN, но было бы неплохо работать с INF-сравнением.
1 ответ
Формат чисел IEEE специально разработан таким образом, чтобы можно было использовать "простое" целочисленное сравнение. Однако это применимо только при сравнении двух чисел с одним и тем же знаком.
Ваше предложение дополнить числа, когда они отрицательны, звучит разумно, так что это сработает.
Это будет работать для +-Inf:s и для ненормальных чисел. NaN:s, однако, не будет работать, или, скорее, они будут считаться "большими", чем inf:s.
Единственным проблемным случаем является "-Zero" (т.е. знак =1, экспонента =0 и мантисса =0). Согласно IEEE, Zero == -Zero. Вы должны решить, хотите ли вы выбросить -Zero как Zero, трактовать их как разные или добавить специальный код в процедуру сравнения.