实数二分注意点总结

实数二分(浮点数二分)主要用于求解单调函数的零点或最值。与整数二分不同,它没有边界 +1/-1 的烦恼,但精度控制是核心难点。


1. 循环终止条件

while (r - l > eps)

eps 设置不当会死循环 |


2. 精度(EPS)设定技巧

若使用 while 控制,遵循 “输出多一位,判定严两阶”

  • 输出要求保留 k 位小数 → 设置 eps = 1e-(k+2)(如保留3位,设 eps=1e-5)。
  • eps 不要小于 1e-15double 有效精度约 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 = midr = 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