Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: How to get better exponentiation?

by haukex (Bishop)
on Jan 22, 2022 at 08:57 UTC ( #11140700=note: print w/replies, xml ) Need Help??


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!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11140700]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (2)
As of 2022-05-29 09:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Do you prefer to work remotely?



    Results (101 votes). Check out past polls.

    Notices?