a+b = d 
a*b = d
b = d - a
a * (d - a) = d
a² - a * d + d = 0
D = d² - 4 * d = d * (d - 4)
a = (d - √D) / 2
b = (d + √D) / 2 
Но если нужен именно двоичный поиск, то:
 int d = Convert.ToInt32(Console.ReadLine());
if (d < 4) {
  Console.WriteLine("NO");
  return;
}
double left = 1.0, right = 2.0;
while (right - left >= 0.0000001) {
  double middle = (left + right) / 2.0;
  if (middle * (d - middle) < d) {
    left = middle;
  } else {
    right = middle;
  }
}
double a = (left + right) / 2.0;
double b = d / a;
Console.WriteLine($"{a:F9} {b:F9}"); 
Меньшее значение ВСЕГДА лежит в диапазоне [1;2], большее - в диапазоне [2;+∞).
Потому, проще искать бисекцией одно меньшее значение.
Это когда ты дискретный индекс ищешь, надо Left + 1 и Right - 1. А когда вещественный корень уравнения, никаких - 0.0000000001 и + 0.0000000001 быть не должно. И Math.Round тоже быть не должно.
Выход из двоичного поиска не когда разница значения функции и требуемого значения меньше эпсилон, а когда ширина отрезка, в котором ищем значение, меньше эпсилон.