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

Re: Any reason NV is not marked as POK when accessed as string?

by dave_the_m (Monsignor)
on Mar 23, 2017 at 11:56 UTC ( [id://1185618]=note: print w/replies, xml ) Need Help??


in reply to Any reason NV is not marked as POK when accessed as string?

Ths stringification of a floating-point number is affected by locale (e.g. '.' verses ',') so the same NV variable could stringify to different strings at different times. Hence the PV value isn't cached.

Dave.

Replies are listed 'Best First'.
Re^2: Any reason NV is not marked as POK when accessed as string?
by demerphq (Chancellor) on Mar 23, 2017 at 19:12 UTC

    What you say makes sense, but makes me wonder why we upgrade NV's to PVNV's, and makes me think maybe we used to trust the cached value... Which makes me wonder if we couldn't change the logic so that when we stringify NV's or PVNV's we check the locale, and /then/ decide to upgrade/trust the cached value. IOW, why are paying a price for a locale switch when there is a decent chance most operations will be under a common locale? Is it expensive to check locale? (I will do some archive digging to see if these answers are in my mailbox, but I thought i would ask anyway).

    ---
    $world=~s/war/peace/g

      ... makes me think maybe we used to trust the cached value

      I think https://www.nntp.perl.org/group/perl.perl5.porters/2016/10/msg240576.html and responses is relevant here.
      As also mentioned there, the stringification of the NV is retained if the NV is an inf or nan.
      I assumed this was ok because stringifications of inf and nan were not affected by locale. (But I notice that stringification of 0.0 to "0" is not retained.)

      Cheers,
      Rob

        It is not very consistent. Consider:

        $ perl -MDevel::Peek -e'$x="1e1"; 0+$x; Dump($x)' SV = PVNV(0xc27550) at 0xc48bc8 REFCNT = 1 FLAGS = (IOK,NOK,POK,pIOK,pNOK,pPOK) IV = 10 NV = 10 PV = 0xc37d80 "1e1"\0 CUR = 3 LEN = 16 $perl -MDevel::Peek -e'$x="1.1e1"; 0+$x; Dump($x)' SV = PVNV(0x1513550) at 0x1534bc8 REFCNT = 1 FLAGS = (IOK,NOK,POK,pIOK,pNOK,pPOK) IV = 11 NV = 11 PV = 0x1523d80 "1.1e1"\0 CUR = 5 LEN = 16

        Something smells here. I think that patch needs to be reviewed and supplanted.

        ---
        $world=~s/war/peace/g

Re^2: Any reason NV is not marked as POK when accessed as string?
by vr (Curate) on Mar 23, 2017 at 13:03 UTC

    Ah, makes sense. Thank you for explanation.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (6)
As of 2024-03-29 05:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found