鱼C论坛

 找回密码
 立即注册
查看: 3726|回复: 4

模拟开平方根

[复制链接]
发表于 2011-5-9 23:42:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 soldier 于 2011-5-10 13:49 编辑
  1. #include <stdio.h>
  2. #include <math.h>

  3. void main()
  4. {
  5. #if(1)
  6.     double Sqrtl( double dn);
  7.     double n;
  8.    
  9.     scanf("%lf",&n);

  10.     printf("平方根为:%.4lf\n",Sqrtl(n));
  11.     printf("实际平方根:%lf\n",sqrt(n));
  12. #endif
  13. }
  14. //开平方根
  15. double Sqrtl( double dn)
  16. {
  17.     double n=0,sn=0;
  18.     n=dn/2;

  19.     while((sn=n*n)>dn)//获取粗略接近真实平方根的值n
  20.     {
  21.         n/=2;
  22.     }
  23.     while((dn-sn)>0)//获取最接近真实平方根的值n
  24.     {
  25.         if((dn-sn)>n*2) //减少循环次数
  26.             n++;
  27.         else
  28.             n=n+1e-4;//控制精度
  29.         sn=n*n;
  30.     }
  31.     return n;
  32. }
复制代码
输入一个数:
49
输出结果:
平方根为:7.0001

有时,结果是正确的(7.0000),但大多数时间都是(7.0001)。并且,测试其它结果时是正确的。比如:9,16,10000

不知道这是为什么呢?还有,我想知道系统的Sqrt()是怎么做的,不知道有什么办法没有?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-10 12:05:46 | 显示全部楼层
n=n+1e-4;//控制精度
写为n=n+1e-5;或者更小就可以得到7了。
要想sqrt函数效率更好,LZ可以百度 牛顿迭代  平方根
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-10 15:02:53 | 显示全部楼层
即使用:n=n+1e-5;
也会出现7.00001的;之前我是用n=n+1e-3;的,不过他出现7.001……:@

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-10 15:07:25 | 显示全部楼层
而且,通过单步调试,按照逻辑来说,也是不应该出现那点小尾巴的!!:funk:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-10 22:46:07 | 显示全部楼层
  1. //牛顿迭代法求平方根,效率特别高
  2. double SqrtN(double n)
  3. {
  4.     double xn=n/2,yn=0;
  5.     int i=0;//计算循环次数

  6.     while(yn!=xn)//7的平方根=2.6457513110646,编译器的最大精度;如果能自主控制那就更好了(如:yn=2.645和xn=3.432比较之类)
  7.     {
  8.         yn=xn;
  9.         xn=(xn+n/xn)/2;
  10.         i++;
  11.     }

  12.     return xn;
  13. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 21:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表