Основная причина в том, что abs
обрабатывает недополнение и переполнение во время промежуточных вычислений.
Так что, если norm
under / overflows, ваша формула возвращает неверный / неточный результат, а abs
вернетправильный (например, если ваши входные числа находятся в диапазоне 10 200 , то результат также должен быть около 10 200 . Но ваша формула даст вамinf
, или исключение с плавающей запятой, потому что промежуточное значение norm
составляет около 10 400 , что выходит за пределы диапазона. Обратите внимание, я предположил, что здесь IEEE-754 имеет 64-битную плавающую точку).
Другая причина в том, что abs
может дать немного более точный результат.
Если вам не нужно обрабатывать эти случаи, потому что ваши входные числа "хорошо себя ведут" (и вам не нужен возможный более точный результат), не стесняйтесь использовать вашу формулу.