https://www.cnblogs.com/wangkundentisy/p/8118007.html
问题描述
给定一个数,如何求它的平方根(不能使用内置函数,如sqrt()函数)。
二分法
这是比较容易想到的一种方法。通过比较中间值与最终值的大小来改变中间值,最终在满足某个精度的情况下返回这个中间值作为最终结果。代码如下:
#include<iostream>
#include<cmath>
using namespace std;
double MySqrt(double n)
{
double _max = n; //此处一定为浮点数,不要用整数
double _min = 0.0;
double p = 1e-5; //此处为精度,当满足该精度时,返回该近似值
double mid = (_max + _min) / 2.0;
while(fabs(mid * mid - n) > p)//此处是浮点数之差的绝对值与精度进行比较
{
if(mid * mid < n)
_min = mid;
else if(mid * mid > n)
_max = mid;
else
return mid;
mid = (_max + _min) / 2.0;
}
return mid;
}
int main()
{
cout<<MySqrt(80)<<endl;
}
牛顿法
牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。
设 是 的根,选取 作为r初始近似值,过点 做曲线 的切线 , 的方程为 ,求出 与 轴交点的横坐标 ,称 为 的一次近似值。
过点 做曲线 的切线,并求该切线与 轴交点的横坐标 ,称 为 的二次近似值。重复以上过程,得 的近似值序列,其中 ,称为 的 次近似值,上式称为牛顿迭代公式。
而开根号的问题可以看作求解 的根。
(1)在曲线
上任取一点
,
,该点的切线方程为:
(2)该切线与x轴的交点为:
#include<iostream>
#include<cmath>
using namespace std;
double MySqrt(double n)
{
double x = 1.0;//设置初值
double p = 1e-5;//设置精度
while(fabs(x*x - n) > p)
{
x = (x + n / x) / 2.0;
}
return x;
}
int main()
{
cout<<MySqrt(82)<<endl;
}