Похоже, что оригинальный программист гарантировал, что ratio
окажется в диапазоне от 0 до 1 (включительно), вероятно, для обеспечения достаточной точности.
Прямое кодирование алгоритма в Википедии выглядит так, как будто есть опасность получить очень большие делители.
Также, насколько я могу судить, следующий тест:
if (abi == 0) {
fprintf(stderr, "z_div.c: division by zero\n");
exit(-1);
}
Значение
может быть истинным только в том случае, если оба значения abi
и abr
равны нулю, поэтому вы окажетесь в реальной ситуации деления на ноль.
(В этот момент оба abi
и abr
были вынуждены быть неотрицательными, и этот путь к коду получен, только когда (abr <= abi)
).
Возможно, вы можете опубликовать небольшой тестовый пример, показывающий, что деление на ноль выполняется, когда r
не равен нулю.