java - float 的紧凑格式

标签 java encoding numbers

有一些特殊格式(base-128)设计用于传输 protobufs 中使用的整数。和 elsewhere 。当大多数整数都很小时,它们是有利的(它们需要一个字节来表示最小的数字,并且可能会浪费一个字节来表示其他数字)。

我想知道 float 是否有类似的东西,假设它们中的大多数实际上是小整数?

<小时/>

针对爱丽丝的回答:我正在考虑类似的事情

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 的情况下这是浪费的。

最佳答案

这取决于你的号码分布。大小实际上并不那么重要,因为它是通过 float 的指数域表示的。通常尾数在存储方面贡献最大的“权重”。

如果您的 float 主要是整数,则可以通过转换为 int(通过 Float.floatToIntBits())并检查有多少个尾随零(对于较小的 int 值,最多应有 23 个尾随零)来获得一些 yield 。当使用简单的方案对小整数进行编码时,您可以简单地实现编码 float :

int raw = Float.floatToIntBits(f);
raw = Integer.reverse(raw);
encodeAsInt(raw);

(解码只是简单地反转该过程)。 其作用只是将尾数中的尾随零移动到 int 表示的最高有效位,这对于为小整数设计的编码方案很友好。

同样适用于 double<->long。

关于java - float 的紧凑格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21409752/

相关文章:

java - 如何在类型为2015-01-13T10 :24:55Z的java中使用SimpleDateFormat解析日期

java - 解析先前 Activity 的值并显示在 android 中的当前 Activity 微调器字段上

java - 使用 java.util.logging 打印不带空格的数字?

java - 如何显示java arraylist的不同步性?

windows-8 - 为什么我的控制台不显示版权符号 ©?

java - Netbeans 无法在 mac 中读取 utf8 文件名

PHP:有没有一种简单的方法可以将数字列表(作为字符串,如 "1-3,5,7-9")解析为数组?

php - 如何在 PHP 中使用带有 json_encode() 的瑞典字母?

c++ - 知道10进制数,求2进制数的位数

c# - 如何将长字符串转换为大数字