http://qs1969.pair.com?node_id=11140700


in reply to How to get better exponentiation?

I don’t know if C’s pow(3) function has the same limitations under Unix?

Yes, I get NaN on Linux too, and pow(3) says "The functions pow(x, y), powf(x, y), and powl(x, y) raise an invalid exception and return an NaN if x < 0 and y is not an integer." and similarly, on my system the manpage says "If x is a finite value less than 0, and y is a finite noninteger, a domain error occurs, and a NaN is returned." If you ask Wolfram Alpha, you have to explicitly tell it you want the real-valued root instead of the principal root, though I'm not enough of an expert to know whether that's relevant here (I did find out you can get all the principal roots via Math::Complex's root). Interestingly, Math::BigInt and Math::BigFloat's ->broot(3) also return NaN, so throwing a use bignum; in the program unfortunately doesn't help in this case.

To get the cube root, you can apparently use cbrt(3), exposed via POSIX as of Perl v5.22:

$ perl -wMstrict -MPOSIX=cbrt -le 'print cbrt(-8)' -2

Replies are listed 'Best First'.
Re^2: How to get better exponentiation?
by Athanasius (Archbishop) on Jan 22, 2022 at 11:19 UTC

    Thanks, haukex, POSIX::cbrt is just what I need! But I’m disappointed to find that POSIX::pow has the same limitations as **. So the more general question remains open.

    Thanks again,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      But I’m disappointed to find that POSIX::pow has the same limitations as **. So the more general question remains open.

      I like the module Math::Prime::Util::GMP a lot because of its many functions that also go beyond prime numbers.

      $ perl -MMath::Prime::Util::GMP=rootreal -le 'print rootreal(-8, 3)' -2.000000000000000000000000000000000000000

      Use 0+rootreal(...) to get just -2 in this case. powreal(-8, 1/3) suffers a bit from the floating-point inaccuracies in 1/3. Note both functions support an optional third argument to specify the number of significant digits, e.g. powreal(-8, 1/3, 5) is "-2.0000".

      Update: However, note the issues raised by vr and syphilis here!