我需要以某种精度评估任何底数的对数,这并不重要。有这个算法吗?我用Java编程,所以我对Java代码很好。
如何快速找到二进制对数?(充其量是 O(1))也许能够回答我的问题,但我不明白。可以澄清一下吗?
我需要以某种精度评估任何底数的对数,这并不重要。有这个算法吗?我用Java编程,所以我对Java代码很好。
如何快速找到二进制对数?(充其量是 O(1))也许能够回答我的问题,但我不明白。可以澄清一下吗?
使用此身份:
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
。
我知道这已经很晚了,但这可能对某些人有用,因为这里的问题是精确的。这样做的一种方法本质上是实现一个寻根算法,该算法从它的基础上使用您可能想要使用的高精度类型,包括简单的 +-x/ 操作。
我建议使用牛顿法,因为它需要的迭代次数相对较少,而且收敛性很好。对于这类应用程序,我相信可以公平地说,只要实现了良好的输入验证,它将始终提供正确的结果。
考虑一个简单的常数“a”,其中
如果寻求解决 a 以使其服从,则
我们可以迭代地使用牛顿法在任何指定的容差内找到“a”,其中每个第 i 个迭代可以通过下式计算
分母是
,
因为这是函数的一阶导数,这是牛顿法所必需的。一旦解决了这个问题,“a”就是“a = log,b(x)”问题的直接答案,可以通过简单的 +-x/ 操作获得,所以你已经可以开始了。“等等,那里有力量?” 是的。如果您可以依靠自己的幂函数足够准确,那么继续在那里使用它就没有问题。否则,您可以使用这些方法将电源操作进一步分解为一系列其他+-x/操作将幂上的任何十进制数简化为两个整数幂运算,可以通过一系列乘法运算轻松计算。这个过程最终会给你留下 nth-roots 来解决,你也可以用 Newton 方法找到它。如果您确实走那条路,则可以将其用于牛顿法
如您所见,必须递归求解,直到达到 b = 1。
呸,但是,是的,就是这样。这是您可以通过确保在整个过程中仅使用 +-x/ 操作来解决问题的方法。下面是我在 Excel 中解决 log,2(3) 的快速实现,与软件原始功能给出的解决方案相比。正如你所看到的,我可以通过监控优化函数给我的内容来不断完善“a”,直到达到我想要的容差。在此,我使用 a=2 作为初始猜测,您可以使用它并且在大多数情况下应该没问题。