in reply to Re^11: PDL and srand puzzle
in thread PDL and srand puzzle

PDL's RNG is at https://github.com/PDLPorters/pdl/blob/master/Basic/Primitive/xoshiro256plus.c, and generates 64(!) bits of randomness, of which only 53 are used in an IEEE 754 double-precision number.

How does one retrieve (from the PDL object that random() returns) that actual double-precision random value as an NV ?
BTW, I initially read "64(!) bits of randomness" as "64! bits of randomness" ... and was very impressed ;-)

Cheers,
Rob

Replies are listed 'Best First'.
Re^13: PDL and srand puzzle
by etj (Priest) on Jun 10, 2024 at 10:35 UTC
    To get a single SV out of an ndarray, use $pdl->at($offset1, ...). That SV will have the appropriate numerical info available, be it NV, IV or UV.

    By the way, this is as you have marioroy has been doing with some of your test scripts, including looping over large ndarrays one element at a time. That made those scripts go impressively slower with PDL than the other versions. PDL has a function to output ndarrays in text column format: https://metacpan.org/pod/PDL::IO::Misc#wcols.

      To get a single SV out of an ndarray, use $pdl->at($offset1, ...)

      Thanks - that's what I was looking for.

      By the way, this is as marioroy has been doing with some of your test scripts


      The only thing I noticed was marioroy's use of $pdl->at.(0) which returned a 15-significant-decimal-digit representation of the value - not what I was looking for:
      C:\>perl -MPDL -MDevel::Peek -le "$pdl = random(); Dump $pdl->at.(0);" SV = PV(0x1c544eeb140) at 0x1c544eeaa10 REFCNT = 1 FLAGS = (PADTMP,POK,pPOK) PV = 0x1c5474d1ca0 "0.2684813620074430"\0 CUR = 18 LEN = 20
      That construct threw me a bit, and I'm way too dense to realize that all I needed to do was to remove the ".":
      C:\>perl -MPDL -MDevel::Peek -le "$pdl = random(); Dump $pdl->at(0);" SV = NV(0x1426b33a8f0) at 0x1426b33a908 REFCNT = 1 FLAGS = (TEMP,NOK,pNOK) NV = 0.32972986684150651
      Cheers,
      Rob
        Recent PDLs, given too few offsets to at (whether because of a syntax mistake or otherwise), throws an error. It allows "too many" offsets, so long as they're all 0, in line with the PDL convention of being able to pretend an ndarray has infinite higher dims all length 1. Your snippet here creates a zero-dim scalar, which then can be either correctly offsetted with no offsets, or over-offsetted with 1 offset.