尽管误差是有限的,但大多数情况下可接受的解决方案是错误的(66%)(它可能比精确结果小2,并且永远不会大)。这来自
- 忽略
x_lo * y_lo
产品 - 首先转移,然后添加
x_hi * y_lo
和x_lo * y_hi
我的解决方案似乎始终适用于非负操作数。
final long x_hi = x >>> 32;final long y_hi = y >>> 32;final long x_lo = x & 0xFFFFFFFFL;final long y_lo = y & 0xFFFFFFFFL;long result = x_lo * y_lo;result >>>= 32;result += x_hi * y_lo + x_lo * y_hi;result >>>= 32;result += x_hi * y_hi;
在十亿个随机操作数上进行了测试。对于极端情况应进行特殊测试并进行一些分析。
处理负操作数将更加复杂,因为它会禁止使用无符号移位并迫使我们处理中间结果溢出。
万一速度无关紧要(很少有),我会去
BigInteger.valueOf(x).multiply(BigInteger.valueOf(y)) .shiftRight(64).longValue();



