Topics

Binary search is a powerful technique for finding a target value within a sorted search space. When dealing with floating-point numbers, some adjustments are needed compared to integer binary search to handle the continuous nature of the space and avoid infinite loops.

Core Idea: repeatedly divide the search interval in half and narrow down the search range based on whether the middle value is “too high” or “too low.”

Implementation Details: Unlike integer binary search where we can check for lo <= hi and terminate when lo == hi + 1, floating-point comparisons require a different approach since, we can never perfectly converge on a continuous value. Here are two methods to achieve the required precision.

  1. Fixed Number of Iterations: Run the binary search for a predetermined number of iterations (e.g., 80). This guarantees termination and often provides sufficient precision for most problems (preferred approach)
  2. Epsilon-Based Comparison: Continue the binary search until the difference between the upper and lower bounds (hi - lo) is smaller than a predefined epsilon value (eps). eps represents the desired level of accuracy. A common value for eps is 1e-7 or 1e-9, depending on the problem’s constraints

Code Template (Epsilon-Based):

double lo = lower_bound;
double hi = upper_bound;
double ans = hi; // Initialize with a default value
 
while (hi - lo > eps) {
  double mid = lo + (hi - lo) / 2.0; // Avoid potential overflow
  if (check(mid)) {
    ans = mid;
    hi = mid; // or hi = mid - eps if you need to exclude mid
  } else {
    lo = mid; // or lo = mid + eps if you need to exclude mid
  }
}
 
// ans now holds the approximate solution

Code Template (Fixed Iterations):

double lo = lower_bound;
double hi = upper_bound;
double ans = hi; // Initialize with a default value
 
for (int i = 0; i < 100; ++i) {
  double mid = lo + (hi - lo) / 2.0;
  if (check(mid)) {
    ans = mid;
    hi = mid - eps;
  } else {
    lo = mid + eps;
  }
}
 
// ans now holds the approximate solution