::pow(T, n) vs std::pow(T, n) for non-constant n

Gabriel Dos Reis gdr@integrable-solutions.net
Sun Mar 14 20:47:00 GMT 2004

Richard Guenther <rguenth@tat.physik.uni-tuebingen.de> writes:

| I'm not at all surprised if ::pow() gets to call libm - because libm
| pow is (double, double) here and has to fall back to taylor series pow
| approximation probably.  There is no integer overload in libm.

There is no overload for integer exponent -- as traditionally libm
seems to contain only "C" functions.  Most implementations I've
seen tried to see whether the exponent is integer or not and implement
a "different" algorithm. Some simply don't.  The standard function
std::pow(T, int) was introduced to handle that case. 

| So we can again cheat by using something like
| double pow(double x, int n)
| {
|     if (__builtin_constant_p(n))
|       return __builtin_pow(x, n);
|     else
|       return __pow_helper(x, n);

I don't think we should be giving different results based on

| or do the right thing with a special __builtin_powi() or use a
| pow_helper in libgcc to which we can dispatch from __bultin_pow() in
| non-optimized/inlined integer exponent case.

If you want to have support for this in the compiler, please work on
__builtin_powi() and the like -- as was discussed last summer.

-- Gaby

More information about the Libstdc++ mailing list