BigInteger 的对数
我有一个 BigInteger
数字,例如超过 264。 现在我想计算该 BigInteger 数字的对数,但方法 BigInteger.log() 不存在。如何计算大 BigInteger
值的(自然)对数?
I have a BigInteger
number, for example beyond 264.
Now i want to calculate the logarithm of that BigInteger
number, but the method BigInteger.log()
does not exist. How do I calculate the (natural) logarithm of my large BigInteger
value?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果你想支持任意大的整数,那么这样做是不安全的,
因为如果参数超出 double 范围(大约 2^1024 或 10^308,即超过 300 个十进制数字),这会失败。 。
这是我自己的类,它提供了方法,
即使 BigDecimal/BigInteger 太大(或太小)而无法表示为 double 类型,它们也可以安全地工作。
If you want to support arbitrarily big integers, it's not safe to just do
because this would fail if the argument exceeds the
double
range (about 2^1024 or 10^308, i.e. more than 300 decimal digits ).Here's my own class that provides the methods
They work safely even when the BigDecimal/BigInteger are too big (or too small) to be representable as a
double
type.我从谷歌那里得到了一些帮助,但显然你不需要直接将 log 应用到你非常大的 BigInteger 数字,因为它可以按以下方式分解:
因此,你的问题被简化为允许对数的计算/近似任意增加精度,也许是 math.stackexchange.com?
I had some help from google but apparently you don't need to apply log to your very big BigInteger numbers directly, since it can be broken down in the following way:
Your problem is therefore reduced to the computation/approximation of logarithms that allow for arbitrary increasing precision, maybe math.stackexchange.com?
将其转换为 BigDecimal 如下所示:
并从 BigDecimalUtils 就可以了:D
Convert it into a BigDecimal liek this:
and call log from BigDecimalUtils on it :D
您需要它有多准确?如果您只需要 15 位精度,则可以执行
此操作,这适用于高达 1023 位的值。之后该值将不再适合双精度。
How accurate do you need it to be? If you only need 15 digits of accuracy you can do
This would work for values up to 1023 bits. After that the value would not fit into a double anymore.
如果您可以使用 Google Guava,并且只需要基数 2 或基数 10 的日志,则可以使用 Guava
BigIntegerMath
类。如果您需要不同的基数,您始终可以使用对数基数变换公式将其中之一转换为您需要的基数。
If you can use Google Guava, and only require base 2 or base 10 log, you can use methods from Guava's
BigIntegerMath
class.If you need a different base, you can always use the logarithm change-of-base formula to convert from one of these, to the one you need.