如果逐渐逼近一个整数的对数值
用精度高的数字的对数好
还是无所谓? 就算查表
但是表的精度是固定死的
不能动态改动呀
我一直想找到完美的解决方案
用简单的步骤能够尽快计算出结果 我在想,下面的泰勒展开式:$e^x=\sum_{n=0}^\infty( x^n/n! )\quad(|x|<+\infty)$
当x比较大时,是否依然高效实用?:Q: 数学上是成立的
但是计算上不适用
最大项是n=或+1,然后向2边递减
我觉得至少找到一种能够得到所需精度的方法
回复 70# gxqcn 的帖子
就算法上,e^x 更容易实现,不论是造对数表还是求一个比较小的x的e^x.至于精度损失,我我的方法始终用的 底数是e, 对对于10^n, 由于n是整数,也不会有精度损失的,另外对于
对数和指数计算,本来就是浮点数,和进制无关,一般情况下也不会取整为一个整数。 对73#,我想应该要求$ |x| <= 1$ 回72楼:
这个我早就想到了,这个对数表是不需要存储精确值的。
下面是这个算法的一些具体实现:
就查表算法而言:
求 e^x 的对数的过程其实就是求这样一个序列:
n_1, n_2, n_3, n_4...n_k, (这几个数的对数分别是 m_1,m_2,m_3,m_4,..m_k), 使得
x=m_1+ m_2+m_3+m_4+...m_k+ r,r为不大于指定的值的余项。
在查表过程中,我们并不需要知道 $m_k$ 的准确值,只需一个精度很小的值就可以了,需要精确到多少位和余项的最大值有关,如余项要求小于10^{-32}, 则这个对数表中中对数值要至少精确到32为有效数字。 同时在这个对数表中,对每一个$n_k$,都要存储他的质数分解式,12/5=2^2*3^1*5^-1. 等这个序列确定了,再求 m_1+m_2+m_3+... m_k的精确值和余项r的精确值。由于$m_k$可以表示为几个小质数的线性表达式,只要这个小质数的对数足够精确, $m_1+ m_2+m_3+..m_k$亦可足够精确。
现在只有一个问题,如何求小质数的对数。对此,可有2个方法。
1. 事先计算出这些小质数的对数,并精度到足够多的有效数字。在计算时,将其值从文件载入,需要多少位就载入多少位。
2.实时求值,程序启动后,预先求出这几个小质数的对数,并精确到预定精度,如果在计算过程,有更高的精度需要,再重新计算到更高的精度。使用好的算法,求解小质数的对数并不困难,其求解速度应该比求同样精度的e更快。 原帖由 无心人 于 2008-12-15 19:42 发表 http://bbs.emath.ac.cn/images/common/back.gif
对73#,我想应该要求$ |x|<= 1$
就公式来说,没有该限定。
但就计算来说,可能在 $ |x|<= 1$ 时收敛才较快,理由见 74# 仙剑魔 的帖子。
我原本想将指数小数点后转成二进制,而后逐级开方再相乘,但感觉效率非常低下。
liangbch 的算法是比较高效的。 计算$e^x$,我们可以将x的二进制指数部分和尾数部分分开(计算机内部表示是二进制,所以这个拆分很简单),假设
$x=a*2^b$,其中$1/2<=|a|<=1$
那么$e^x=(e^a)^{2^b}$
所以可以先计算$e^a$,然后连续平方b次 上述算法比较可行,后面的平方只要保留到指定精度即可,
而 $e^a$ 的计算就可用 liangbch 的算法。