[petsc-dev] What was the 64-bit problem with pow()?

Jed Brown jed at 59A2.org
Mon May 30 09:53:47 CDT 2011


On Mon, May 30, 2011 at 16:38, Matthew Knepley <knepley at gmail.com> wrote:

> You wrote the code that takes PetscInt p!!! If you do not want that, change
> it to PetscReal.


Right, I was relying on standard promotion rules and forgot about
std::pow(scalar, int). The exponent is a loop counter, so it can't
reasonably be made a scalar. This whole thing could be implemented without
calling pow() in any form, just multiplication, but it's not in a
performance-sensitive place and I thought the code would be easier to read
this way.

The reason I brought this up is that I thought it was worth standardizing a
way to get an integer power (this is a common thing to need in adaptive
controllers). Should we add a function like PetscPowRealInt()? This seems
ugly, but it's also ugly and confusing to deal with these functions
resolving to quite different things on C versus C++ builds (with the usual
variability in C++ compilers). This code is over a year old so it shouldn't
have new portability issues. The existence of a new ticket seems like a
defect in the process, but I'm not sure what the best fix is.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20110530/9adbe51c/attachment.html>


More information about the petsc-dev mailing list