【问题标题】:Can java floats be sorted by their byte representations?java浮点数可以按它们的字节表示排序吗?
【发布时间】:2009-11-23 23:46:55
【问题描述】:

我在 Hadoop 中工作,我需要提供一个比较器来将对象排序为原始网络顺序字节数组。这对我来说很容易用整数来做——我只是按顺序比较每个字节。我也需要为花车做这个。我认为,但我找不到参考,Java 使用的浮点数的 IEEE 754 格式可以通过将每个字节作为有符号的 8 位值进行比较来排序。

谁能证实或反驳这一点?

编辑:表示为 IEEE 754 32 位浮点。我实际上有一个(更大的)字节缓冲区以及该缓冲区内的偏移量和长度。我发现已经有一些实用方法可以很容易地把它变成一个浮点数,所以我想这个问题是没有实际意义的。我仍然很好奇是否有人知道答案。

【问题讨论】:

    标签: java floating-point byte ieee-754


    【解决方案1】:

    正浮点数的顺序与其位表示形式相同,被视为 2s 补码整数。负浮点数不会。

    例如,-2.0f 的位表示为0xc0000000,-1.0f 为0xbf800000。如果您尝试对表示进行比较,则会得到 -2.0f > -1.0f,这是不正确的。

    还有 NaN 的问题(它将无序与所有浮点数据进行比较,而表示则没有),但您可能不关心它们。

    【讨论】:

      【解决方案2】:

      这几乎可以工作:

      int bits = Float.floatToIntBits(x);
      bits ^= (bits >> 31) & Integer.MAX_VALUE;
      

      这里负浮点数的 0-30 位反转(因为您想要与原始符号/幅度表示形式相反的顺序,同时保留符号位。)

      注意事项:

      • 排序中包含 NaN(如果涉及 NaN,最好考虑未定义的结果。)
      • +0 现在比较大于 -0(内置关系运算符认为它们相等。)

      它适用于所有其他值,包括非正规和无穷大。

      【讨论】:

        【解决方案3】:

        使用 Float.toIntBits(float) 并比较整数。

        编辑:这仅适用于正数,包括正无穷大,但不适用于 NaN。对于负数,您必须颠倒顺序。而且正数当然大于负数。

        【讨论】:

          【解决方案4】:

          好吧,如果您通过网络传输数据,您应该在传输 int 和传输 float 时使用某种形式的语义表示。由于它是与机器无关的信息,因此数据类型宽度也应该在某个地方定义或由规范预定义(即 32 位或 64 位浮点数)。所以,你真正应该做的是将你的字节累积成适当的数据类型,然后使用自然语言数据类型进行比较。

          要真正准确地回答,我们需要查看您的发送和接收代码,以查看您是否通过某种装饰的 i/o 流或类似的东西对原语进行自动装箱。如需更好的答案,请提供更详细的信息。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-08
            • 1970-01-01
            • 2012-10-14
            • 1970-01-01
            • 1970-01-01
            • 2010-12-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多