Is there any advantage to using pow(x,2) instead of x*x, with x double?
FWIW, with gcc-4.2 on MacOS X 10.6 and -O3
compiler flags,
x = x * x;
and
y = pow(y, 2);
result in the same assembly code:
#include <cmath>
void test(double& x, double& y) {
x = x * x;
y = pow(y, 2);
}
Assembles to:
pushq %rbp
movq %rsp, %rbp
movsd (%rdi), %xmm0
mulsd %xmm0, %xmm0
movsd %xmm0, (%rdi)
movsd (%rsi), %xmm0
mulsd %xmm0, %xmm0
movsd %xmm0, (%rsi)
leave
ret
So as long as you're using a decent compiler, write whichever makes more sense to your application, but consider that pow(x, 2)
can never be more optimal than the plain multiplication.
std::pow
is more expressive if you mean x², x*x
is more expressive if you mean x*x, especially if you are just coding down e.g. a scientific paper and readers should be able to understand your implementation vs. the paper. The difference is subtle maybe for x*x
/x²
, but I think if you use named functions in general, it increases code expessiveness and readability.
On modern compilers, like e.g. g++ 4.x, std::pow(x,2)
will be inlined, if it is not even a compiler-builtin, and strength-reduced to x*x
. If not by default and you don't care about IEEE floating type conformance, check your compiler's manual for a fast math switch (g++ == -ffast-math
).
Sidenote: It has been mentioned that including math.h
increases program size. My answer was:
In C++, you
#include <cmath>
, not math.h. Also, if your compiler is not stone-old, it will increase your programs size only by what you are using (in the general case), and if your implementation ofstd::pow
just inlines to corresponding x87 instructions, and a modern g++ will strength-reducex²
withx*x
, then there is no relevant size-increase. Also, program size should never, ever dictate how expressive you make your code is.
A further advantage of cmath
over math.h
is that with cmath
, you get a std::pow
overload for each floating point type, whereas with math.h
you get pow
, powf
, etc. in the global namespace, so cmath
increases adaptability of code, especially when writing templates.
As a general rule: Prefer expressive and clear code over dubiously grounded performance and binary size reasoned code.
See also Knuth:
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"
and Jackson:
The First Rule of Program Optimization: Don't do it. The Second Rule of Program Optimization (for experts only!): Don't do it yet.