gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:43:17 25 4
gpt4 key购买 nike

假设我有两个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com