鱼C论坛

 找回密码
 立即注册
查看: 2957|回复: 23

[技术交流] sqrt算法实现

[复制链接]
发表于 2015-9-25 20:23:07 | 显示全部楼层 |阅读模式
88鱼币
请问:

如何在C语言中实现开方(不用<math.h>算法)

我想定义一个函数,名叫sqrt.

谢谢。

最佳答案

查看完整内容

double sqrt_1(double input) { int i,count=0; double output=1, x = 0.0000001, x1=1, x2=1, x3=1, x0, a=0.5; // x1为a*(a-1)(a-2)...(a-n+1), x2为(input-1)^n, x3为n!, x0为通项:(x1*x2)/x3 // 泰勒展开为1+通项(从1到n),结果保存为output。 // x为精度(可以变成手动), a为指数(这里是开方所以指数为0.5) if(input>=2) // 当x>2时泰勒展开无效,必须先除以2,记录除以的次数保存在count { input / ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-25 20:23:08 | 显示全部楼层
double sqrt_1(double input)
{
        int i,count=0;

        double output=1, x = 0.0000001, x1=1, x2=1, x3=1, x0, a=0.5;
        //  x1为a*(a-1)(a-2)...(a-n+1), x2为(input-1)^n, x3为n!, x0为通项:(x1*x2)/x3
        // 泰勒展开为1+通项(从1到n),结果保存为output。
        // x为精度(可以变成手动), a为指数(这里是开方所以指数为0.5)
        if(input>=2)        // 当x>2时泰勒展开无效,必须先除以2,记录除以的次数保存在count
        {
                input /= 4;
                count++;
        }
        for(i=1; 1; i++) // 一级循环
        {
                x1 *= a;
                a -= 1;

                x2 *= (input-1);        // x2 = x^n

                x3 *= i;        // x3 = n!

                x0 = (x1*x2)/x3;        // x0 = (x1*x3)/x2

                output += x0;

                if((x0 < x)&&(-x < x0))
                {
                        break;
                }
        }       
        for(i=0; i<count;i++)        //把之前除以2的次数找回来
        {
                output *= 2;
        }
        return output;
}
第一次解答有些慌张。。发了那么多遍(前面没写注释)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-26 14:02:24 | 显示全部楼层
你的意思是不用math.h 自带的函数,自己编写一个sqrt 功能一样的函数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-26 14:51:33 | 显示全部楼层
double sqrt_1(double input)
{
        int i,count=0;

        double output=1, x = 0.0000001, x1=1, x2=1, x3=1, x0, a=0.5;

        if(input>=2)
        {
                input /= 4;
                count++;
        }
        for(i=1; 1; i++)// 一级循环
        {
                x1 *= a;
                a -= 1;

                x2 *= (input-1);        // x3 = x^n

                x3 *= i;        // x3 = n!

                x0 = (x1*x2)/x3;        // x0 = (x1*x3)/x2

                output += x0;

                if((x0 < x)&&(-x < x0))
                {
                        break;
                }
        }       
        for(i=0; i<count;i++)
        {
                output *= 2;
        }
        return output;
}

在被开方数校园大于2时可用泰勒展开(自行百度)
超过的话就化为根号4*根号(x/4)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-26 14:52:14 | 显示全部楼层
战w9diwdo 发表于 2015-9-26 14:51
double sqrt_1(double input)
{
        int i,count=0;

错了,小于2时用泰勒展开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-26 14:52:46 | 显示全部楼层
double sqrt_1(double input)
{
        int i,count=0;

        double output=1, x = 0.0000001, x1=1, x2=1, x3=1, x0, a=0.5;

        if(input>=2)
        {
                input /= 4;
                count++;
        }
        for(i=1; 1; i++)// 一级循环
        {
                x1 *= a;
                a -= 1;

                x2 *= (input-1);        // x3 = x^n

                x3 *= i;        // x3 = n!

                x0 = (x1*x2)/x3;        // x0 = (x1*x3)/x2

                output += x0;

                if((x0 < x)&&(-x < x0))
                {
                        break;
                }
        }        
        for(i=0; i<count;i++)
        {
                output *= 2;
        }
        return output;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-26 16:53:04 | 显示全部楼层
看看学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-26 18:24:15 | 显示全部楼层
我也不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-26 18:25:07 | 显示全部楼层
44444444
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-27 08:20:15 | 显示全部楼层
555555555
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-27 08:20:50 | 显示全部楼层
44444444444444
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-27 08:21:32 | 显示全部楼层
4444444444444444444
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-27 08:22:28 | 显示全部楼层
655555555555
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-27 08:23:22 | 显示全部楼层
44444444
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-27 08:24:41 | 显示全部楼层
11111111111111111111111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-27 08:25:13 | 显示全部楼层
0000000000000000000000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-9-28 11:44:30 | 显示全部楼层
y290176346 发表于 2015-9-26 14:02
你的意思是不用math.h 自带的函数,自己编写一个sqrt 功能一样的函数?

yes.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-28 15:38:37 | 显示全部楼层

楼上给这不给你答案了,虽然不知道对错,其实原理就是平方的反运算,数a 的平方小于x,数c的平方大于x,那x的开放就在a到c之间,然后再c-a的平方的结果,在同样的方法找两个接近的数,最后看你的小数点的精度就可以了,错的地方大神不要笑我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-28 17:21:43 | 显示全部楼层
y290176346 发表于 2015-9-28 15:38
楼上给这不给你答案了,虽然不知道对错,其实原理就是平方的反运算,数a 的平方小于x,数c的平方大于x, ...

嗯!没想到!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-28 20:34:39 | 显示全部楼层

没想到啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-20 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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