【问题标题】: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 流或类似的东西对原语进行自动装箱。如需更好的答案,请提供更详细的信息。