in reply to Re: Supporting long long types in XS
in thread Supporting long long types in XS

Use a 32 bit int (i.e. T_IV or T_UV) which has the advantage that any numbers in the 32 bit range can be accurately be represented,

Note that this is not an advantage over NV (floating point). A Perl NV can exactly represent any 52-bit integer (53 if you count the sign bit) on almost any platform (I think even Crays use standard IEEE 8-byte double-precision floating point numbers). 52-bit values often are quite sufficient for such situations (address 4 peta bytes or store 142 years in microseconds).

But if you really want to allow for full 64-bit values, my first idea was also to use a string of digits for the representation. That is probably the best choice for an XS interface, as it will conveniently and silently allow the user to switch to NV or IV if they don't need values that won't fit in such a type (or don't need full precision for some values in the case of NV).

But doing this right will be a little tricky. In particular, you'll need to pay attention to what value types the scalar passed to you has, and which of those value type(s) is/are primary. Perhaps use the scalar's NV if SvNOK() [not SvNOKp()] or not SvPOK(), otherwise use the scalar's PV [if SvPOK() but not SvNOK()].

- tye        

  • Comment on Re^2: Supporting long long types in XS (NV,PV)

Replies are listed 'Best First'.
Re^3: Supporting long long types in XS (NV,PV)
by Joost (Canon) on Nov 21, 2006 at 20:10 UTC

      No, there's nothing to worry about ( when doing floating point operations on < 52 bit ints stored in doubles ). Floating point errors come from the inability to represent a number accurately within the available precision. No error is loss when the number can be accurately represented within the available precision.

      Update: Added the text in bold parens for clarity.

      Reach your own conclusions?

      $nv = 2**33;; printf "%.f\n", $nv;; 8589934592 printf "%d\n", $nv;; -1 print $nv;; 8589934592 print $nv & 1;; 1 print $nv;; 8589934592

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Joost asks:
        can floating point arithmatic on integers (I mean operations on < 52 bit ints stored in doubles) lose precision?
        BrowserUK writes:
        printf "%d\n", $nv;;
        print $nv & 1;;
        Neither printf "%d" nor $nv & 1 is "floating point arithmatic".