42

我需要以某种精度评估任何底数的对数,这并不重要。有这个算法吗?我用Java编程,所以我对Java代码很好。

如何快速找到二进制对数?(充其量是 O(1))也许能够回答我的问题,但我不明白。可以澄清一下吗?

4

2 回答 2

101

使用此身份:

log b (n) = log e (n) / log e (b)

其中log可以是任何底数的对数函数,n是数,b是底数。例如,在 Java 中,这将找到 256 的以 2 为底的对数:

Math.log(256) / Math.log(2)
=> 8.0

Math.log()顺便说一句,使用 base e。还有Math.log10(),它使用 base 10

于 2012-12-12T01:07:20.597 回答
2

我知道这已经很晚了,但这可能对某些人有用,因为这里的问题是精确的。这样做的一种方法本质上是实现一个寻根算法,该算法从它的基础上使用您可能想要使用的高精度类型,包括简单的 +-x/ 操作。

我建议使用牛顿法,因为它需要的迭代次数相对较少,而且收敛性很好。对于这类应用程序,我相信可以公平地说,只要实现了良好的输入验证,它将始终提供正确的结果。

考虑一个简单的常数“a”,其中 log_b(x) = a

如果寻求解决 a 以使其服从,则 x - b^a = 0

我们可以迭代地使用牛顿法在任何指定的容差内找到“a”,其中每个第 i 个迭代可以通过下式计算 a_i = a_{i-1} - \frac{x - b^a}{-ab^{a-1}}

分母是

-ab^{a-1} = \frac{\partial}{\partial a},

因为这是函数的一阶导数,这是牛顿法所必需的。一旦解决了这个问题,“a”就是“a = log,b(x)”问题的直接答案,可以通过简单的 +-x/ 操作获得,所以你已经可以开始了。“等等,那里有力量?” 是的。如果您可以依靠自己的幂函数足够准确,那么继续在那里使用它就没有问题。否则,您可以使用这些方法将电源操作进一步分解为一系列其他+-x/操作将幂上的任何十进制数简化为两个整数幂运算,可以通过一系列乘法运算轻松计算。这个过程最终会给你留下 nth-roots 来解决,你也可以用 Newton 方法找到它。如果您确实走那条路,则可以将其用于牛顿法

\frac{\partial (\sqrt[b]{x})}{\partial x} = \frac{\sqrt[b]{x}}{bx}

如您所见,必须递归求解,直到达到 b = 1。

呸,但是,是的,就是这样。这是您可以通过确保在整个过程中仅使用 +-x/ 操作来解决问题的方法。下面是我在 Excel 中解决 log,2(3) 的快速实现,与软件原始功能给出的解决方案相比。正如你所看到的,我可以通过监控优化函数给我的内容来不断完善“a”,直到达到我想要的容差。在此,我使用 a=2 作为初始猜测,您可以使用它并且在大多数情况下应该没问题。

牛顿法求解对数运算

于 2021-11-01T03:06:13.203 回答