Существуют специальные форматы (base-128), предназначенные для передачи целых чисел, используемых в protobufs и elsewhere. Они выгодны, когда большинство целых чисел являются небольшими (для каждого из них требуется один байт для наименьших чисел и может отбрасывать один байт для других).Компактный формат для чисел с плавающей запятой
Интересно, есть ли что-то подобное для чисел с плавающей запятой в предположении, что большинство из них на самом деле являются малыми целыми числами?
Для решения ответ Алиса: Я думал о чем-то вроде
void putCompressedDouble(double x) {
int n = (int) x;
boolean fits = (n == x);
putBoolean(fits);
if (fits) {
putCompressedInt(n);
} else {
putUncompressedLong(Double.doubleToLongBits(x));
}
}
Это работает (для отрицательного нуля, что я на самом деле не волнует, кроме), но это расточительный в случае fits == true
.
Я принимаю ваше решение, так как это красиво и просто. В моем собственном ответе я даю результаты (лучшее сжатие может быть достигнуто, но это намного сложнее). – maaartinus