鱼C论坛

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

模拟开平方根

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

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

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

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

void main()
{
#if(1)
    double Sqrtl( double dn);
    double n;
    
    scanf("%lf",&n);

    printf("平方根为:%.4lf\n",Sqrtl(n));
    printf("实际平方根:%lf\n",sqrt(n));
#endif
}
//开平方根
double Sqrtl( double dn)
{
    double n=0,sn=0;
    n=dn/2;

    while((sn=n*n)>dn)//获取粗略接近真实平方根的值n
    {
        n/=2;
    }
    while((dn-sn)>0)//获取最接近真实平方根的值n
    {
        if((dn-sn)>n*2) //减少循环次数
            n++;
        else
            n=n+1e-4;//控制精度
        sn=n*n;
    }
    return n;
}
输入一个数:
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 | 显示全部楼层
//牛顿迭代法求平方根,效率特别高
double SqrtN(double n)
{
    double xn=n/2,yn=0;
    int i=0;//计算循环次数

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

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

本版积分规则

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

GMT+8, 2025-2-6 19:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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