实数二分注意点总结
实数二分(浮点数二分)主要用于求解单调函数的零点或最值。与整数二分不同,它没有边界 +1/-1 的烦恼,但精度控制是核心难点。
1. 循环终止条件
while (r - l > eps)
eps 设置不当会死循环 |
2. 精度(EPS)设定技巧
若使用 while 控制,遵循 “输出多一位,判定严两阶”:
- 输出要求保留
k位小数 → 设置eps = 1e-(k+2)(如保留3位,设eps=1e-5)。 eps不要小于1e-15(double有效精度约 15~16 位),否则极易死循环。
3. Mid 的计算
- 标准写法:
double mid = (l + r) / 2.0; - 防溢出(虽罕见但习惯):
double mid = l + (r - l) / 2.0; - 禁止使用整数右移
>> 1或整数除法。
4. Check 函数的单调性与边界移动
- 前提:
check(mid)必须具有单调性。 - 移动规则(根据目标调整):
- 找最小值可行(
true在右侧)→l = mid; - 找最大值可行(
true在左侧)→r = mid;
- 找最小值可行(
- 更新时不要写
mid ± 1,直接l = mid或r = mid。
5. 输出精度控制
- C++:
cout << fixed << setprecision(6) << (l+r)/2.0 << endl; - 建议输出
(l+r)/2.0而非仅l,以中和最后一次迭代的微小偏差。
6. 避坑清单(速查)
- ❌ 不要使用
float,统一double。 - ❌ 不要写
while (l < r)(实数几乎不会相等)。 - ❌
check内避免除零(可能产生inf/NaN)。
分类: 公告
· 更新时间 2026-8-28 21:36:09