Michael-Bern 发表于 2015-9-25 20:23:07

sqrt算法实现

请问:

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

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

谢谢。

战w9diwdo 发表于 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;
}
第一次解答有些慌张。。发了那么多遍(前面没写注释)

y290176346 发表于 2015-9-26 14:02:24

你的意思是不用math.h 自带的函数,自己编写一个sqrt 功能一样的函数?

战w9diwdo 发表于 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)

战w9diwdo 发表于 2015-9-26 14:52:14

战w9diwdo 发表于 2015-9-26 14:51
double sqrt_1(double input)
{
        int i,count=0;


错了,小于2时用泰勒展开

战w9diwdo 发表于 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;
}

y290176346 发表于 2015-9-26 16:53:04

看看学习了

weisuo 发表于 2015-9-26 18:24:15

我也不知道

weisuo 发表于 2015-9-26 18:25:07

44444444

weisuoaaaaaa 发表于 2015-9-27 08:20:15

555555555

weisuoaaaaaa 发表于 2015-9-27 08:20:50

44444444444444

weisuoaaaaaa 发表于 2015-9-27 08:21:32

4444444444444444444

weisuoaaaaaa 发表于 2015-9-27 08:22:28

655555555555

weisuoaaaaaa 发表于 2015-9-27 08:23:22

44444444

weisuoaaaaaa 发表于 2015-9-27 08:24:41

11111111111111111111111

weisuoaaaaaa 发表于 2015-9-27 08:25:13

0000000000000000000000

Michael-Bern 发表于 2015-9-28 11:44:30

y290176346 发表于 2015-9-26 14:02
你的意思是不用math.h 自带的函数,自己编写一个sqrt 功能一样的函数?

yes.

y290176346 发表于 2015-9-28 15:38:37

Michael-Bern 发表于 2015-9-28 11:44
yes.

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

战w9diwdo 发表于 2015-9-28 17:21:43

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

嗯!没想到!

y290176346 发表于 2015-9-28 20:34:39

战w9diwdo 发表于 2015-9-28 17:21
嗯!没想到!

没想到啥?
页: [1] 2
查看完整版本: sqrt算法实现