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 тоже быть не должно.
Выход из двоичного поиска не когда разница значения функции и требуемого значения меньше эпсилон, а когда ширина отрезка, в котором ищем значение, меньше эпсилон.