Java 比较字节数组中存储的双精度的最有效方法?

Java 比较字节数组中存储的双精度的最有效方法?,java,Java,假设我有两个字节[]数组,b1和b2,它们的字节对应于两个双字节。 一种选择是类似于 double thisValue = readDouble(b1, s1); double thatValue = readDouble(b2, s2); return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1)); double thisValue=readDouble(b1,s1); double thatValue=

假设我有两个字节[]数组,b1和b2,它们的字节对应于两个双字节。 一种选择是类似于

double thisValue = readDouble(b1, s1);
double thatValue = readDouble(b2, s2);
return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1));
double thisValue=readDouble(b1,s1);
double thatValue=readDouble(b2,s2);
返回(thisValue
它使用

/** 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));
}
/**解析字节数组中的整数*/
公共静态整型readInt(字节[]字节,整型开始){

返回((字节[开始]&0xff)一个字节数组可能包含规范化双精度值的位模式,而另一个字节数组可能包含相同值的非规范化表示。在这种情况下,转换和比较为双精度值将成功,而比较字节值将失败。

比较浮点值存在很多问题按位比较的ues-例如,一个数字可能是非规范的,而另一个不是。它们可能是“相等的”或可比较,但它们的按位表示形式将不相同。

由于的原因,您不能简单地检查所有位是否相同:例如,-0和+0具有不同的表示形式,但被视为相等;而具有许多不同表示形式的NaN值永远不等于任何值,包括具有同样的代表

虽然可以自己实现这些检查,但很快就会变得非常复杂,不值得这样做:您需要检查的“子值”没有自己的字节,因此您仍然必须提取字节并将其转换为更大的值,然后您必须实际检查所有不同的条件


换句话说,你最终做的事情与上面的代码一样,但是你花费了更多的代码行,而且你的表现不太可能比现有的更好。

我说,你得到“最有效”答案的唯一真正方法是做15-20分钟的实验。我真的不知道我会做什么f使用您详细介绍的hadoop方法将比将字节[]加载到ByteArrayInputStream并用DataInputStream装饰该流快(或更准确/不准确)

让我们知道你的基准是什么

byte[] myData = ........
ByteArrayInputStream bais = ByteArrayInputStream(myData);
DataInputStream dis = DataInputStream(bais);

double d1 = dis.getDouble();
double d2 = dis.getDouble();