java - 比较存储在字节数组中的 double 的最有效方法?

标签 java

假设我有两个 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 源 herehere )。

问题是,您有它们的字节表示形式,因此将它们实际情况化为 double 似乎很浪费,尽管这可能经过了高度优化,可以忽略不计。我确信 Hadoop 人员知道他们在做什么,我只是好奇为什么直接比较这些位不会更好/更快?或者也许编译器足够聪明,可以看到这种事情并做到这一点。

谢谢

最佳答案

由于structure IEEE floating-point format的,您不能简单地检查所有位是否相同:例如,-0 和 +0 具有不同的表示形式,但被认为是相等的; NaN 值有许多不同的表示形式,永远不等于任何值,包括具有相同表示形式的其他 NaN 值。

虽然您自己当然可以实现这些检查,但它很快就会变得非常复杂,并且不值得:您需要检查的“子值”没有自己的字节,因此您仍然必须提取字节并抛出它们变成更大的值 - 然后你必须实际检查所有不同的条件。

换句话说,您最终会执行与上述代码相同的操作,但是您花费了更多的代码行,并且您不太可能比现有代码执行得更好。

关于java - 比较存储在字节数组中的 double 的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641919/

相关文章:

java - 在EC2上运行Spark,只使用了一个Executor(应该更多)

Java - 双端队列手册 - 删除最后一个

java - 了解 SWT 常量的按位或

java - Android 应用程序空白但不在设计器中?

java - 使用 while 循环和扫描器验证输入

java - 在weka java中找不到makeCopy方法的符号

java - 使用 OKHTTP3 上传带有进度条的多个文件

java - 自定义字体为 Android 中的某些字母组合提供了不正确的字形

Java 程序 - 使用字符串和正则表达式验证电子邮件地址

java - 是否可以从私有(private)内部类覆盖公共(public)方法?