Пока целочисленный продукт не переполнится, оба метода будут вести себя одинаково.Я бы предпочел использовать std::abs()
, потому что это более четко указывает мои намерения - сравнить величину двух чисел.Если я использую продукт a * a
, любые другие сопровождающие, которые читают по коду, зададутся вопросом, что означает a * a
.
Хотя за пределами буквального вопроса я считаю важным подчеркнуть, что эти два метода расходятсянамного быстрее для нецелых типов.Что касается плавающей запятой, вы очень быстро столкнетесь с ошибками округления, что приведет к немного отличающимся сравнениям, которые иногда могут дать неправильный результат (можно утверждать, что вы не должны делать прямые сравнения с плавающей запятой в любом случае, а вместо этого ограничивать диапазон, новсе еще).
Более тонко, сравнение значений complex
таким образом будет некорректным.Типичное вычисление абсолютного значения для комплексного числа a + bi
составляет sqrt(a^2 + b^2)
, где ^
обозначает возведение в степень.Однако (a + bi)^2
даст a^2-b^2 + 2abi
, что не может быть равным когда-либо для ненулевых a
и b
.