Не важно, проходили ли
math.h.

Если проходили, как вообще работают инклуды и заголовки, этого будет достаточно (все стандартные заголовки проходить ни в одном курсе не станут). Хотя, видимо, не проходили. А английский, увы, надо подтягивать. Сейчас документация там, где она существует, гарантированно будет, в основном, только на нём (худшие случаи: она будет на чём-то другом, но тогда ещё меньше шансов на русскоязычную; или её вообще не будет), и у многих вещей (в число которых стандарты C не входят) документация может обновляться так часто, что перевод будет легко и беззаботно устаревать, если только это не документация чего-то от какой-нибудь большой компании, имеющей достаточно ресурсов.
Код странный. Зачем, например, поместили условный оператор в блок? Там нет никаких определений, которые бы после закрытия блока вышли бы из области видимости, так что разницы с его отсутствием никакой. Далее, можно было три условия объединить логической операцией
|| (или). Наконец, последнее условие включает в себя первое:

. И на самый конец, условия просто слишком сильные в любом случае, они зарубят и вполне приемлемые значения

. Например, для случая

.
Наконец, не всегда проверять корректность данных проще до вычислений, чем проверить корректность ответа после вычислений, когда они могут делаться с частично некорректными данными. Вот в этом случае если какой-то множитель

окажется слишком близким к нулю, его результатом будет то самое специальное значение
±inf, при умножении на которое конечных чисел оно так и останется не-конечным-числом (может превратиться в
NaN, может остаться бесконечностью того или другого знака), на которое проверить один раз результат может оказаться проще, чем проверить

на неравенство всем

.
IEEE754
Слова о котором, как я понимаю, в подобных курсах тоже обычно обходят стороной. Увы. Хотя это не так много, если не вдаваться в детали (которые, правда, тоже нужно знать, даже если не собираешься отлаживать численные алгоритмы, потому что интересность — особенно если поддержка стандарта неполная, а она мало где полная, насколько помню — вылезет когда-нибудь всё равно).