使用对数而不是大数的除法?

时间:2011-02-20 14:22:14

标签: java math biginteger division

我无法为我的问题提出一个合适的标题,但允许我陈述我的情况;我想以下列形式计算显着性比率:p = 1 - X / Y

此处 X 来自迭代过程;该过程需要大量的步骤,并计算过程可以在不同的状态(存储在HashMap中)结束的不同方式。一旦迭代结束,我选择了许多状态并对它们的值求和。很难说这些数字有多大,所以我打算将总和实现为BigInteger

另一方面,

Y 来自二项式系数,其数字以千位为单位。我倾向于使用logGamma来计算这些系数,结果给出了该值的自然对数。

我感兴趣的是以最佳/最有效的方式进行 X / Y 的划分。如果我能以自然对数得到 X ,那么我可以减去幂并将结果设为1 - e ^(lnX - lnY)。

我发现BigInteger无法对Math.log进行对数化,在这种情况下我该怎么办?

3 个答案:

答案 0 :(得分:2)

您可以使用双打。双倍可以非常大,大约1.7e308。缺少的是精确度:它只支持大约15位数。但是如果你可以使用15位数的精度(换句话说,如果你不关心1,000,000,000,000,000和1,000,000,000,000,001之间的差异),那么双打可能会让你足够接近。

答案 1 :(得分:2)

如果您要计算数千的数字的二项式系数,那么Double将不够好。

相反,我倾向于在数字上调用toString方法,并将日志计算为log(10) * number.toString().length() + log(asFloat("0." + number.toString()),其中asFloat采用数字的字符串表示形式并将其转换为浮点数。

答案 2 :(得分:0)

如果你需要最大精度,那么如何将BigIntegers转换为BigDecimals并对它们进行代数处理。如果精度不是最重要的,那么也许你可以将你的BigIntegers转换为双精度并用它们做简单的代数。也许您可以告诉我们更多关于您的问题域以及为什么您认为对数是最好的方法。