总体上,浮点数二分查找框架和定点数一样,前面有三篇文章介绍定点数相关二分查找。
1、标准二分查找模板。https://blog.csdn.net/justidle/article/details/104303389。
2、标准二分查找左边界模板。https://blog.csdn.net/justidle/article/details/104304725。
3、标准二分查找右边界模板。https://blog.csdn.net/justidle/article/details/104304742。
这里就简单的介绍一下浮点数二分查找代码框架,其他方面的知识请参考上面三篇文章。
要点
总体上来说:三个变量(左边界、右边界、中间值) + 判断条件(右边界更新条件和左边界更新条件)+ 返回值。唯一要注意的就是这几个变量的类型要使用 double。
- 循环条件: fabs(right-left)>eps
- 使用二分: mid = (right + left)/2
- 左边界更新:left = mid
- 右边界更新: right = mid
关于精度eps
浮点数二分查找最坑的地方就在这个 eps 的定义。个人总结的 eps 定义总体原则如下:
1、eps 要足够大。否则答案精度可能不够。
2、可以参考题目要求的输出,将 eps 定义为输出精度的加两个数量级。例如题目输出是精确到小数点 4 位,那么我们可以如下定义:
const double eps = 1e-6;
不同点
和定点数的二分查找不同的地方有以下几个方面:
1、使用二分查找。
2、三个变量(左边界、右边界、中间值) 必须使用 double 类型。
3、查找循环条件不同。判断浮点数相等的方法和判断定点数相等方法是不一样的,一般我们定义一个精度范围 eps,两个浮点数之差的绝对值在 eps 之内,我们就认为这两个浮点数是相同的。
代码模板
C++
//校验函数
bool check(double x) {
...
}
//下面是主框架
double left = -1e6;//左边界。可以根据题目具体查找条件修改
double right = 1e6;//右边界。可以根据题目具体查找条件修改
double eps = 1e-9;//精度
double mid;//中值
while (fabs(right-left)>eps) {
mid=(right+left)/2;
ans = calc(mid);
//使用mid计算
if (check(mid)) {
right = mid;
} else {
left = mid;
}
}
//left就是最终的结果