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