Re: [eigen] fix double-promotion in 3.3 Core/SpecialFunctions.h |

[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]

On 05.05.2016 at 14:36, Ilja Honkonen wrote:

std::pow(float, int) actually gets promoted to std::pow(double, double).

Note that this is correct as of c++11:
http://en.cppreference.com/w/cpp/numeric/math/pow

`Yes, I looked that up as well. I don't know what gave me the idea that
``there were pow(float, int) and pow(double, int) overloads.
`

This is especially bad for std::pow(x, 2). Inside Eigen we can use

Does pow(x, 2.0) fix it? If not, pow(x, float(2)) at least should...

`Yes that would work, but it is inefficient. I (wrongfully) expected
``pow(x, 2) to be evaluated to x*x, at least if the exponent is known at
``compile time and small. That could work, if pow(float, int) got
``evaluated to some __builtin_pow function and the compiler decides
``depending on the size of the exponent how to evaluate it.
``But I admit that would either cause a branch or an inefficient power by
``squaring in case the exponent is big. I guess evaluating
``pow(x,2147483647) by repeated squaring is less efficient than
``exp2(log2(x)*2147483647) [which actually is a case where casting the
``exponent to float loses a tiny bit of precision].
`
Christoph
--
Dipl. Inf., Dipl. Math. Christoph Hertzberg
Universität Bremen
FB 3 - Mathematik und Informatik
AG Robotik
Robert-Hooke-Straße 1
28359 Bremen, Germany
Zentrale: +49 421 178 45-6611
Besuchsadresse der Nebengeschäftsstelle:
Robert-Hooke-Straße 5
28359 Bremen, Germany
Tel.: +49 421 178 45-4021
Empfang: +49 421 178 45-6600
Fax: +49 421 178 45-4150
E-Mail: chtz@xxxxxxxxxxxxxxxxxxxxxxxx
Weitere Informationen: http://www.informatik.uni-bremen.de/robotik