以前写二分变量都是整型类型的二分,最近写了两题浮点数的二分,发现了自己在处理精度时有很多问题。所以在这小小的总结一下
个人目前使用的浮点数二分写法是这样的:
/*
l为左端点,r为右端点,mid为二分中点,
ans为最终答案,cmp为对比值
check()函数计算当前mid所产生的值
*/
const double eps = 1e-9;
double l, r, mid, ans;
while(fabs(l-r)>=eps){
mid = (l+r)/2;
if(check(mid)<cmp)
l = mid;
else
r = mid;
}
ans = mid;
重要的一点是,关于误差eps,如果设置得过小,在测试很多时,有可能会TLE,如果过大,会导致精度问题。注意不要写check(mid)和cmp判等的这种判断。此外,将mid定义在外面,之间就可以将最后一次mid值赋给ans