我需要计算任何底的对数,这并不重要,达到一定的精度。有没有解决这个问题的算法?我用Java编程,所以我对Java代码没意见。
How to find a binary logarithm very fast? (O(1) at best)也许能回答我的问题,但我不明白。它能被澄清吗?
发布于 2021-11-01 03:06:13
我知道这是非常晚的,但这可能会对一些人有用,因为这里的问题是精确度。要做到这一点,一种方法是实现一个根查找算法,该算法从基础开始使用您可能想要使用的高精度类型,由简单的+-x/操作组成。
我建议实现牛顿的方法,因为它需要相对较少的迭代,并且具有很好的收敛性。具体地说,对于这类应用程序,如果实现了良好的输入验证,我相信可以公平地说,它将始终提供正确的结果。
考虑一个简单的常数"a“,其中

当a被寻求求解以使其服从时,则
我们可以迭代地使用Newton method在任何指定的容差范围内找到"a“,其中每个a-i次迭代可以计算为
分母是
,
因为这是函数的一阶导数,这是牛顿法所必需的。一旦这个问题解决了,"a“就是"a = log,b(x)”问题的直接答案,可以通过简单的+-x/操作得到,所以你已经可以开始了。“等等,那里有电源吗?”是。如果你可以依靠你的能力函数足够准确,那么在那里继续使用它是没有问题的。否则,您可以通过使用these methods将幂运算进一步分解为一系列其他+-x/运算,从而将幂上的任何十进制数简化为两个整数幂运算,这两个整数幂运算可以通过一系列乘法运算轻松计算。这个过程最终会给你留下需要求解的n次根,你也可以用牛顿法找到它。如果你真的走上这条路,你可以使用牛顿法
如你所见,必须递归求解,直到你达到b= 1。
但是,是的,就是这样。这是一种解决问题的方法,通过确保在整个过程中只使用+-x/运算来使用高精度类型。下面是我在Excel中做的一个快速实现,用于求解log,2(3),与软件原始函数给出的解决方案进行了比较。正如您所看到的,我可以通过监控优化函数提供给我的内容来不断改进"a“,直到达到我想要的容差。在这里,我使用a=2作为初始猜测,您可以使用它,并且在大多数情况下都应该没问题。

https://stackoverflow.com/questions/13831150
复制相似问题