首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对数算法

对数算法
EN

Stack Overflow用户
提问于 2012-12-12 09:04:41
回答 1查看 53.1K关注 0票数 40

我需要计算任何底的对数,这并不重要,达到一定的精度。有没有解决这个问题的算法?我用Java编程,所以我对Java代码没意见。

How to find a binary logarithm very fast? (O(1) at best)也许能回答我的问题,但我不明白。它能被澄清吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-01 03:06:13

我知道这是非常晚的,但这可能会对一些人有用,因为这里的问题是精确度。要做到这一点,一种方法是实现一个根查找算法,该算法从基础开始使用您可能想要使用的高精度类型,由简单的+-x/操作组成。

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

考虑一个简单的常数"a“,其中

![](https://chart.googleapis.com/chart?cht=tx&chl=log_b(x%29=a)

当a被寻求求解以使其服从时,则

我们可以迭代地使用Newton method在任何指定的容差范围内找到"a“,其中每个a-i次迭代可以计算为

![](https://chart.googleapis.com/chart?cht=tx&chl=a%7Bi-1%7D%20-%20%5Cfrac%7Bx%20-%20b%5Ea%7D%7B(-a%29b%5E%7Ba-1%7D%7D)

分母是

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

![](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7B%5Cpartial(%5Csqrt%5Bb%5D%7Bx%7D%29%7D%7B%5Cpartial%7Bx%7D%7D=%5Cfrac%7B%5Csqrt%5Bb%5D%7Bx%7D%7D%7Bbx%7D)

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

但是,是的,就是这样。这是一种解决问题的方法,通过确保在整个过程中只使用+-x/运算来使用高精度类型。下面是我在Excel中做的一个快速实现,用于求解log,2(3),与软件原始函数给出的解决方案进行了比较。正如您所看到的,我可以通过监控优化函数提供给我的内容来不断改进"a“,直到达到我想要的容差。在这里,我使用a=2作为初始猜测,您可以使用它,并且在大多数情况下都应该没问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13831150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档