| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4471 人关注过本帖
标题:关于开平方的c程序
只看楼主 加入收藏
boliyuan
Rank: 1
来 自:四川南充
等 级:新手上路
帖 子:59
专家分:2
注 册:2007-6-26
结帖率:100%
收藏
 问题点数:0 回复次数:2 
关于开平方的c程序
关于开平方的c程序就是不让调用sqrt()这个函数,请问这个程序怎么写啊?
我就是不知道一个数怎样用算术的方法来算它的平方根,像15*15=225;25*25=625.....它们到底有什么规律啊?
搜索更多相关主题的帖子: 平方 算术 sqrt 函数 
2007-09-14 21:06
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
牛顿迭代法,百度一下或者google一下这个关键字。。。。



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
2007-09-14 21:19
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 

数学库也不大为什么不用呢? 你的RAM和ROM有那么小么,太小自己在片外扩充下,估计你用51的。

高数中有无穷级数展开,可以用无穷级数逼近一个函数的值。
二项展开式: (1+x)^m = 1 + m*x + [m*(m-1)/2!]*x^2 + ... + [m*(m-1)...*(m-n+1)/n!]*x^n + ...
(-1 < x < 1)

x,m取合适的值可以算任何数的任意次方,这种麦克劳林展开式取有限项后余项|R(x)| < e^|x| * |x|^(n+1)/(n+1)!
用这个余项上限可以做误差分析。

我百度了一下搜到这些算法:


算法1:
假设被开放数为a,如果用sqrt(a)表示根号a 那么((sqrt(x)-sqrt(a/x))^2=0的根就是sqrt(a)
变形得
sqrt(a)=(x+a/x)/2
所以你只需设置一个约等于(x+a/x)/2的初始值,代入上面公式,可以得到一个更加近似的值,再将它代入,就得到一个更加精确的值……依此方法,最后得到一个足够精度的(x+a/x)/2的值。
如:计算sqrt(5)
设初值为2
1)sqrt(5)=(2+5/2)/2=2.25
2)sqrt(5)=(2.25+5/2.25)/2=2.236111
3)sqrt(5)=(2.236111+5/2.236111)/2=2.236068
这三步所得的结果和sqrt(5)相差已经小于0.001

或者可以用二分法:
设f(x)=x^2-a
那么sqrt(a)就是f(x)=0的根。
你可以先找两个正值m,n使f(m)<0,f(n)>0
根据函数的单调性,sqrt(a)就在区间(m,n)间。
然后计算(m+n)/2,计算f((m+n)/2),如果它大于零,那么sqrt(a)就在区间(m,(m+n)/2)之间。
小于零,就在((m+n)/2,n)之间,如果等于零,那么(m+n)/2当然就是sqrt(a)。这样重复几次,你可以把sqrt(a)存在的范围一步步缩小,在最后足够精确的区间内随便取一个值,它就约等于sqrt(a)。

2007-09-14 22:25
快速回复:关于开平方的c程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024374 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved