将长数学转换为使用双精度数

时间:2015-04-20 18:31:06

标签: double rounding long-integer precision

如果我有一个使用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

这是最好的,或者是否有一些技巧/黑客可以让它更优雅?

0 个答案:

没有答案