1.解的范围为实数,可以直接这样
left = 0.0, right = 0x3f3f3f3f;
while (dcmp(right - left) != 0){
mid = (right + left) / 2.0;
if (judge(mid)) right = mid;
else left = mid;
}
2.解的范围是整数,有两种方式
左闭右开形式:
int lb = 1, ub = N+1;
while(lb + 1< ub){
int mid = (ub + lb) / 2;
if(judge(mid)) lb = mid;
else ub = mid;
}
左开右闭形式 :
int lb = 0, ub = N;
while(lb + 1< ub){
int mid = (ub + lb) / 2;
if(judge(mid)) ub = mid;
else lb = mid;
}
但是在所有情况下,上面的几种形式都是等价的呢? 答案是不是的。
结论:上述形式的选取和judge对应的函数的单调性有关。如果judge函数是单调递增的,应该选取左开右闭形式。反之,如果judge函数是单调递减的,应该选取左闭右开的形式。