假设我有两个 byte[] 数组,b1 和 b2,它们的字节对应于两个 double 。 一种选择是......
double thisValue = readDouble(b1, s1);
double thatValue = readDouble(b2, s2);
return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1));
它使用...
/** Parse an integer from a byte array. */
public static int readInt(byte[] bytes, int start) {
return (((bytes[start ] & 0xff) << 24) +
((bytes[start+1] & 0xff) << 16) +
((bytes[start+2] & 0xff) << 8) +
((bytes[start+3] & 0xff)));
}
/** Parse a long from a byte array. */
public static long readLong(byte[] bytes, int start) {
return ((long)(readInt(bytes, start)) << 32) +
(readInt(bytes, start+4) & 0xFFFFFFFFL);
}
/** Parse a double from a byte array. */
public static double readDouble(byte[] bytes, int start) {
return Double.longBitsToDouble(readLong(bytes, start));
}
(代码取自 apache hadoop 源 here 和 here )。
问题是,您有它们的字节表示形式,因此将它们实际情况化为 double 似乎很浪费,尽管这可能经过了高度优化,可以忽略不计。我确信 Hadoop 人员知道他们在做什么,我只是好奇为什么直接比较这些位不会更好/更快?或者也许编译器足够聪明,可以看到这种事情并做到这一点。
谢谢
最佳答案
由于structure IEEE floating-point format的,您不能简单地检查所有位是否相同:例如,-0 和 +0 具有不同的表示形式,但被认为是相等的; NaN 值有许多不同的表示形式,永远不等于任何值,包括具有相同表示形式的其他 NaN 值。
虽然您自己当然可以实现这些检查,但它很快就会变得非常复杂,并且不值得:您需要检查的“子值”没有自己的字节,因此您仍然必须提取字节并抛出它们变成更大的值 - 然后你必须实际检查所有不同的条件。
换句话说,您最终会执行与上述代码相同的操作,但是您花费了更多的代码行,并且您不太可能比现有代码执行得更好。
关于java - 比较存储在字节数组中的 double 的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641919/