计算机是如何计算 log 函数的?

链接:https://www.zhihu.com/question/333371020

编辑:深度学习与计算机视觉

声明:仅做学术分享,侵删

就是比如已知一个实数(或者复数)k,求其 log(base n)。
想知道具体算法以用于简化一些修正算法。

作者:小亦
https://www.zhihu.com/question/333371020/answer/1686069171

不要听什么歪门邪道,我们看标准方案,这套方案是 1993 年由 Sun Microsystems 正式写入 C 标准库的方案,函数为 double ieee754log(double x)(ieee754: IEEE二进制浮点数算术标准)。但这套方法为了性能的苛刻而写得过于复杂,我提核心的捡。

总体思路:所有的对数函数计算核心都是利用多项式展开(泰勒级数)然后多项式求和计算结果。为了性能或者精度的要求可能会对展开后的求和式子做进一步优化,最终会封装一个 函数出来。其余的对数函数都是使用换底公式来套 函数做的最底层实现,随着大量图形运算的需求提升, 函数实现得好不好直接决定你电脑快不快。

我们具体讲一下,感兴趣的小伙伴可以端碗白米饭。

首先,我们有换底公式:

所以我们知道所有的对数函数的计算都可化为两个 函数相除,比如:


我们只需要解决如何求 函数就可以了。

这才开篇进入正题!我们先看 函数的实现源码(程序里面都是用 代替 表示自然底数的对数函数):


这么艹的代码,是不是看一眼就不想看了。别急,咱个儿挑重点讲。

1. 参数约化(Argument Reduction)

将输入的一个数字 重整化为这个形式 ,其中 . 以确保 小到足够合适,要不然之后换元的泰勒展开精度会很差。

然后很容易发现规律: ,其中 口算都能算出来,我们来进一步关注 的计算。

2. 计算 1+f 的对数值

将第一步的 进行计算,其结果因范围控制得比较小,所以很容易近似到一个很精确的值。计算方法:

取中间代换变量 (为什么这么代换呢?因为泰勒对 函数的展开在 接近 的时候最好),则有泰勒展开:

我们用一个 Remez 算法来求解 (具体参考百科 Remez算法 ),逼近到 14 次方项,此时的精度可以到 这个级别,完全足够满足 64 位浮点运算要求了,于是上式的 就可以等于:

其中每一项 都需要带对应指数,式子可满足精度 ,且 都是常数,从上面的代码可以看到这些常数的值。

然后根据 ,我们有进一步的代换关系:

于是有:

则:

另外,如果要求更高精度的话,重复代换关系可得:

于是有:

则:

总览一下:其中的 是个常数, 项也是通过 7 个常数和 的值计算得到的,所以这个方法依赖了 8 个常数和 3 个变量 ,变量关系为 .

上面的代码看起来复杂,但核心也就这些,多的都是些边界判断,比如 是不是 算出来的 的精度符不符合要求这类。如果感兴趣的话建议抽时间自己再手动实现一遍以加深印象,指不定哪天就用上了呢。

作者:知乎用户
https://www.zhihu.com/question/333371020/answer/1291443465

如果是有限精度的,比如正常的32-bit或64-bit浮点数,应该是用多项式计算,不一定是泰勒,因为泰勒不会在所有输入范围达到差不多的精度。这可以通过一致逼近多项式或者是直接用多项式基投影法来算出所得多项式,并且固化到硬件上。比如,x86提供了FYL2X指令来计算 。理论上,任意的软件包都会尽量直接调用硬件。

如果要计算任意精度,可以用AGM(Arithmetic–Geometric Mean)迭代法,其原理是选定后,进行迭代,可证序列有公共极限,记作

现在由如下的重要定理,对

且此式子对于为复数也成立(当然)。

所以,指定精度参数 后,我们可以对进行逼近。当然必须把的缩放下,使得,否则AGM不收敛。算法收敛速度为指数级。


作者:TimidCreeper
https://www.zhihu.com/question/333371020/answer/739322764

1.想想看这问题能不能直接在网上找到答案?

2.想想看查有这些函数软件的公式源码能不能解决?

3.如果都试过了,这么是否考虑过查阅专业书籍或网站上针对性的提问搜索?毕竟这不算是特别偏门冷僻的问题。

4.最后,个人印象中是用泰勒公式计算的。供参考。详细结果相信上面的几条方法已经能搜到了

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值