Всегда используйте умножение языка, если в языке нет явной функции square
. В частности, избегайте использования функции pow
, предоставляемой большинством математических библиотек. Умножение будет (за исключением самых возмутительных обстоятельств) всегда быстрее и - если ваша платформа соответствует спецификации IEEE-754, что делает большинство платформ - даст правильно округленный результат. Во многих языках нет стандарта, определяющего точность функции pow
. Как правило, это даст высококачественный результат для такого простого случая (многие реализации библиотек будут возводить в квадрат особые случаи, чтобы спасти программистов от самих себя), но вы не хотите зависеть от этого [1].
Я вижу огромное количество кода на C / C ++, где разработчики написали:
double result = pow(someComplicatedExpression, 2);
возможно, чтобы не вводить это сложное выражение дважды или потому, что они думают, что это каким-то образом замедлит их код для использования временной переменной. Не будет Компиляторы очень, очень хороши в оптимизации такого рода вещей. Вместо этого напишите:
const double myTemporaryVariable = someComplicatedExpression;
double result = myTemporaryVariable * myTemporaryVariable;
Чтобы подвести итог: используйте умножение. Это всегда будет, по крайней мере, так же быстро и, по крайней мере, так же точно, как все, что вы можете сделать [2].
1) Последние компиляторы на основных платформах могут оптимизировать pow(x,2)
в x*x
, когда семантика языка позволяет это. Однако не все компиляторы делают это при всех настройках оптимизации, что является рецептом для сложных отладочных ошибок округления. Лучше не зависеть от этого.
2) Для основных типов. Если вы действительно хотите разобраться с этим, если умножение необходимо реализовать в программном обеспечении для типа, с которым вы работаете, есть способы выполнить операцию возведения в квадрат, которая быстрее, чем умножение. Однако вы почти никогда не окажетесь в ситуации, когда это имеет значение.