如果我有一个使用long
(64位整数)值执行的计算,最终结果永远不会超过52位(精度为double
- 精度浮点数),那么是使用double
实现此计算的最佳方法,以便始终产生相同的答案?
例如,在执行两个大数字的乘法时遇到困难:如果long
溢出,则会丢弃最高顺序位,但如果{{1} }"溢出" (即结果最多超过52个有效位),它会丢弃最低顺序位。
举个例子,让我们在Java的double
类(编辑了一下)中使用next(...)
函数:
Random
(请注意乘法可能会溢出protected int next(int bits) {
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); // seed is a long
return (int) (seed >>> (48 - bits));
}
,但结果是AND转低至48位)
如果我需要在没有long
数据类型(例如JavaScript)的语言中完全复制此函数(或任何其他使用long
)的行为,那么最有效的方法是什么这样做? One of the GWT-implementations of this function将种子分成两半,每行24位,以消除溢出(再次编辑一下):
long
这是最好的,或者是否有一些技巧/黑客可以让它更优雅?