1

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

任何人都可以证实或反驳这一点吗?

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

4

4 回答 4

3

正浮点数与它们的位表示具有相同的顺序,被视为 2s 补码整数。负浮点数没有。

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

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

于 2009-11-24T00:42:56.680 回答
3

这几乎有效:

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

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

注意事项:

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

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

于 2011-05-28T16:39:57.997 回答
1

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

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

于 2009-11-24T07:05:18.987 回答
0

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

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

于 2009-11-24T00:02:48.430 回答