社区
数据结构与算法
帖子详情
请教: log, ln, 开根号,的算法
yifenggd
2003-12-10 03:59:20
请教: log, ln, 开根号,的算法, 急需! 谢谢
...全文
3349
21
打赏
收藏
请教: log, ln, 开根号,的算法
请教: log, ln, 开根号,的算法, 急需! 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
liangbch
2004-03-15
打赏
举报
回复
求常数的对数,参见http://numbers.computation.free.fr/Constants/constants.html
liangbch
2004-03-15
打赏
举报
回复
1.通过特殊的方法事先计算出一些小质数的对数,如集合a=
{2,3,5,7,11,13}
2.找出一组分数,形成数组A,使这些分数依次递增并且大致呈等比数列分布,并且这些分数的分子和分母的所有质因数均来自集合a,可直接求值,且任意两个数的比小于d1,d1略大于1:
如 1,1.1, 1.2,1,1.3,1.4,1.5,1.6,1.8,2,2.1,2.2,2.4,2.6,3.0,3.2...9.6,9.8,10
3。如果求x的对数,可首先将其化为 x1*10^f1的形式,则lg(x)=lg(x1)+f1.
4. 在数组A中,找一个数a[i],使a[i]<x1,a[i+1]>x1,另f2=A[i],x1=x2*f2,则lg(x)=lg(x1)+f1= f1+ lg(f2)+ lg(x2),这里x2 一定小于d1,换言之,x2是一个略大于1的数,可以利用泰勒公式求值,且速度很快。
5。如果想得到更高的精度,在利用泰勒公式求x2时,需要计算的项仍然很多,这时可以再建立一个数组B[1..n],使B[n]略大于d1,对于每一个i,B[i+1]/B[i]<d2,d2是一个比d1 更接近1的数,这样 x2= f3 * x3 ,f3为数组B中的某一个元素,lg(x)=f1+lg(f2)+lg(f3)+lg(x3),由于1<x3<d2<d1,故在利用泰勒公式求lg(x3)时,计算的项数将更少。
6。按此思路,为了减少计算量,可以继续做一个数组C,依次类推。但是数组不可以不断增加,一方面增加了存储空间,另一方面,在构建数组A[1..n]时,A[1]>1,A[n]小于d,d越小,满足条件(数组各个元素可以用分数表示,分数分子分母的所有质因数均为小质数,且分子分母不不能超过计算机中整数的表示范围)的数组元素越少。
7。在查表时,可以使用2分查找算法,如果想进一步提高速度,可以建立一个查找表,相当于索引,由一个数 确定索引的位置可以使用公式法,由索引值在数组中查找时,可使用顺序或者2分查找算法。
利用这个算法可以将某一个数的对数计算到很高精度,且速度很快,这是我在编写超级计算器时,经过长时间的研究而得到的一个算法,这是首次公开,如有人利用我的算法,希望注明出处。
计算一些整数的对数的算法,许多地方均有介绍,请感兴趣者查找。
ybei
2004-03-11
打赏
举报
回复
泰勒展开
szAlanLiao
2004-02-21
打赏
举报
回复
c++提供的log10()函数运算太慢了。我想了一个办法:
lg(x)=lg(a.bcd*10^n)=lg(a.bcd)+lg(10^n)=lg(a.bcd)+n;
然后做了一张[1.000~9.999]的lg(x)表。
这样比ln(x)=2(t+t^3/3+t^5/5+...)这种方法就当会快,
不过要浪费70k左右的空间。
有没有更好的??
solomon1
2003-12-24
打赏
举报
回复
我觉得可以用级数展开,应该行吧,ok?
liangbch
2003-12-24
打赏
举报
回复
在我的《软件超级计算器》(http://www.csdn.net/cnshare/soft/3/3229.shtm)实现了三角/反三角,指数/对数(ln,log10)的算法,可以将任意一个数的函数计算到14-300位,该程序完成于2000.10月。现在我有了更好的算法,但是也很复杂,等我有时间,给你 提供一些计算的方法和思路。
liangbch
2003-12-24
打赏
举报
回复
在计算(ln(x)),时,当 x和1的差很大时,迭代非常慢,直接使用泰勒公式不可取,需要做一些预处理,才可以使用泰勒公式,例如:
ln(x)=ln(x0 * x1)=ln(x0)+ln(x1),x0:可以通过某种方法求的,x1非常接近于1,这样就可以求得ln(x),此题的关键如何选取x0,使得x0的对数很容易求得,而且x0非常接近于x.
这里提供一个链接(求一些常数的对数,平方根等)http://numbers.computation.free.fr/Constants/constants.html
gnefuil
2003-12-23
打赏
举报
回复
都可以泰勒展开的,根据需要的精度,展开到某一项,然后带入具体的x计算就可以了
saint001
2003-12-23
打赏
举报
回复
420*x+630*x^2+260*x^3+25*x^4
ln(1+x)=---------------------------------
420+840*x+540*x^2+120*x^3+6*x^4
|x|在0附近时精确,精度非常高,比如求log(2)
ChoboZelluX
2003-12-23
打赏
举报
回复
求平方根的算法
http://www.csdn.net/Develop/Read_Article.asp?Id=18830
zalyer
2003-12-14
打赏
举报
回复
学习一下。
ZhangYv
2003-12-11
打赏
举报
回复
mathe...大牛现形!
kbsoft
2003-12-11
打赏
举报
回复
mathe大大N久不见了,想念中...
mathe
2003-12-11
打赏
举报
回复
开根号用牛顿迭代法最方便
x(k+1)=(x(k)+a/x(k))/2
log同ln的区别就是差一个ln(10),
对于ln(x)
如果x非常大或者非常小,可以先通过乘以或除以e的若干次方来解决。
如果是在计算机里,还有个技巧,通过其二进制 表示,我们可以知道
2^k<=x<2^(k+1),
我们只要先计算ln(x/2^k/sqrt(2))最后加上(k+1/2)*ln(2)就可以了
所以我们只要对1/2<=x<3/2计算ln(x)
最快的方法是计算
x=(1+t)/(1-t)
即
t=(x-1)/(x+1)
所以|t|<1/3.
然后
ln(x)=2(t+t^3/3+t^5/5+...)
pheavecn
2003-12-11
打赏
举报
回复
我知道单片机中汇编开方的算法。
用的是一位一位试的方法。
amdcwf
2003-12-11
打赏
举报
回复
看看,高数第二册里的多项式展开那一章,相信是很有帮助的
pheavecn
2003-12-11
打赏
举报
回复
TO:mathe
看来您是数值计算的高手。
单片机没有乘除法,运算速度也慢,ram小。
计算器里是用模仿手算的方法。
我多写单片机的程序,以前有个单是写计算器,我知识缺乏,没敢接。
所以现在对这些算法特留意。
HUNTON
2003-12-10
打赏
举报
回复
很多介绍牛顿迭代的书都把开平方的作为牛顿迭代法的例子来讲解
saint001
2003-12-10
打赏
举报
回复
错了一点
x(k+1)=x(k)-1+a/e^x(k)
saint001
2003-12-10
打赏
举报
回复
求解f(x)=0的牛顿迭代法
x(k+1)=x(k)-f(x(k))/f'(x(k))
特别的,对于f(x)=x*x-a,即开方
x(k+1)=(x(k)+a/x(k))/2
对于f(x)=e^x-a,对数
x(k+1)=x(k)-1+a/e^x
加载更多回复(1)
基本初等函数复习(题型最全、最细、最精).doc
基本初等函数复习(题型最全、最细、最精).doc
容斥原理解N以下的素数个数
用容斥原理解N以下的素数个数π(N),10亿以下时间<1秒
科学计算器
上学期期末课程设计用MFC制作的科学计算器 有需要的可以下再来看看 实现了 + 根号 三角函数 对数 1 x x^2 x^3 2^x 阶乘等功能
MathLibrary:用JavaScript编写的数学库
数学库 用JavaScript编写的数学库。
时间复杂度:根号n一般来说大于
log
(n)
对这函数求导后,比较分母大小,可以得到结论。两个函数的图像如下,只在。当n>16时,就必然。
数据结构与算法
33,019
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章