sqrt算法实现
请问:如何在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 /= 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;
}
第一次解答有些慌张。。发了那么多遍(前面没写注释) 你的意思是不用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;
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:51
double sqrt_1(double input)
{
int i,count=0;
错了,小于2时用泰勒展开 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;
} 看看学习了 我也不知道
44444444 555555555 44444444444444 4444444444444444444 655555555555 44444444 11111111111111111111111 0000000000000000000000 y290176346 发表于 2015-9-26 14:02
你的意思是不用math.h 自带的函数,自己编写一个sqrt 功能一样的函数?
yes. Michael-Bern 发表于 2015-9-28 11:44
yes.
楼上给这不给你答案了,虽然不知道对错,其实原理就是平方的反运算,数a 的平方小于x,数c的平方大于x,那x的开放就在a到c之间,然后再c-a的平方的结果,在同样的方法找两个接近的数,最后看你的小数点的精度就可以了,错的地方大神不要笑我 y290176346 发表于 2015-9-28 15:38
楼上给这不给你答案了,虽然不知道对错,其实原理就是平方的反运算,数a 的平方小于x,数c的平方大于x, ...
嗯!没想到! 战w9diwdo 发表于 2015-9-28 17:21
嗯!没想到!
没想到啥?
页:
[1]
2