以精度位循环终止条件
while(r-l<eps)//其中eps是所需要的精度
{
mid = (l+r)/2;
...
}
(1)10^-5=0.00001 (2)为什么要x^2 和2比较,因为x=\sqrt{2} ,只有x和\sqrt{2} 不停比较,最后当不符合精度要求时就能得出近似值了。
代码如下:
const double eps = 1e-5;
double f(double x)
{
return x * x; //函数f(x)=x^2
}
double calSqrt()
{
double left = 1, right = 2;
double mid;
while (right - left > eps) //当条件不满足精度条件时退出
{
mid = (right + left) / 2; //取left和right的中点
if (f(mid) > 2) //如果f(mid)在
right = mid;
else
left = mid;
}
return mid;
}
如果把f(x)=x^2 看成f(x)=x^2 -2,则判断方向的if语句则改为f(mid)>0。
代码如下:
const double eps = 1e-5;
double f(double x)
{
return x * x - 2;
}
double calSqrt()
{
......
while (right - left > eps)
{
......
if (f(mid) > 0)
......
}
return mid;
}
上述问题实际是这个问题的特例:给定一个定义在L, R上的单调函数f(x),求方程f(x) = 0 的根。
const double eps = 1e-5;
double f(double x)
{
return ....;
}
double solve(double L, double R)
{
double left = L, right = R; //[left,right]=[L,R]
double mid;
while (right - left > eps)
{
mid = (right + left) / 2;
if (f(mid) > 0)
right = mid;
else
left = mid;
}
return mid;
}
版权所有:可定博客 © WNAG.COM.CN
本文标题:《浮点数的二分》
本文链接:https://cloud.tencent.com/developer/article/1616931
特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com,尊重他人劳动成果,谢过~