Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re^5: Introspection into floats/NV

by ikegami (Patriarch)
on Jun 04, 2025 at 17:50 UTC ( [id://11165249]=note: print w/replies, xml ) Need Help??


in reply to Re^4: Introspection into floats/NV
in thread Introspection into floats/NV

See Mini-Tutorial: Formats for Packing and Unpacking Numbers

F is for the build's NV
d is for the build's double

The sub requires an IEEE double.

There's no way to know if F is an IEEE double or not.
There's no way to know if d is an IEEE double or not.

But as far as I know, double and thus d is an IEEE double on all machines on which Perl currently runs.

But some people build Perl which uses long double for NV. So d is more reliable for a sub requiring an IEEE double.

But since you're more interested in inspecting an NV, F would make more sense for you. But you would also need to handle formats other than an IEEE double.

Replies are listed 'Best First'.
Re^6: Introspection into floats/NV
by LanX (Saint) on Jun 04, 2025 at 19:03 UTC
    > There's no way to know if F is an IEEE double or not.

    I'm confused, I'm expecting F to return 32, 64, 80 or 128 bits (at least)

    And d always 64 bits

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

      Not surprising. Most machines support IEEE doubles, and most if not all C compilers on such machines will define double to be an IEEE double. But the C standard does not require this.

      That's why I followed up with: "But as far as I know, double and thus d is an IEEE double on all machines on which Perl currently runs." Maybe you missed this?

        I'm not a C programmer,

        So let me restate my question, provided perl is compiled with other settings. (FP32,FP64,FP80,FP128, etc?)

        Will F return another bitlength? ¹

        Citing the docs

        f A single-precision float in native format. d A double-precision float in native format. F A Perl internal floating-point value (NV) in native format D A float of long-double precision in native format. (Long doubles are available only if your system supports long double values. Raises an exception otherwise. +(* WRONG see demo) Note that there are different long double formats.)

        What I read - and can't test² - is that F will produce f,d or D according to the setting.

        D will fail* if not internally available, but f and d will coerce° accordingly.

        Unfortunately, there is no mention of the FP80³ format you mentioned in another thread.

        If I'm wrong, don't you think perldocs of packtut and pack should clarify this?

        update 1

        1)

        From our previous discussion:

        > > > There's no way to know if F is an IEEE double or not.

        > > I'm confused, I'm expecting F to return 32, 64, 80 or 128 bits (at least)

        IEEE double means FP64, if F returns different bit length it's possible to tell that it's not a FP64.

        It might be much trickier to tell if its according to IEEE though (i.e. position and format of sign and exponent)

        update 2

        ²) well lets try

        *) wrong °)seems to be true

        main::(-e:1): 0 DB<1> say unpack "B*", pack "f", 1/3 10101011101010101010101000111110 DB<2> say unpack "B*", pack "d", 1/3 0101010101010101010101010101010101010101010101011101010100111111 DB<3> say unpack "B*", pack "F", 1/3 0101010101010101010101010101010101010101010101011101010100111111 DB<4> say unpack "B*", pack "D", 1/3 0000000010101000101010101010101010101010101010101010101010101010111111 +0100111111000000000000000000000000000000000000000000000000 DB<5> use warnings; say unpack "B*", pack "D", 1/3 # NO EXCE +PTION RAISED 0000000010101000101010101010101010101010101010101010101010101010111111 +0100111111000000000000000000000000000000000000000000000000

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        see Wikisyntax for the Monastery

        ³) According to Wikipedia is "64-extended" only loosely defined as having 79+ bits

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (3)
As of 2025-07-14 15:09 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.