java浮点数可以按其字节表示进行排序吗?

时间:2009-11-23 23:46:56

标签: java floating-point byte ieee-754

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

有人可以确认或反驳这个吗?

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

4 个答案:

答案 0 :(得分:3)

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

例如,-2.0f的位表示为0xc0000000,-1.0f为0xbf800000。如果您尝试在表示中使用比较,则得到-2.0f> -1.0f,这是不正确的。

还有NaNs的问题(比较所有浮点数据无序,而表示没有),但你可能不关心它们。

答案 1 :(得分:3)

这几乎有效:

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

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

注意事项:

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

要真正准确地回答,我们需要查看您的发送和接收代码,以查看您是否通过某种装饰的i / o流或某些此类内容自动装箱原语。如需更好的答案,请提供更好的细节。