The limit of the mantissa is the ULP. For a double-precision float typically used in perl, it's 2**-52 times the main power of two for the number:

perl -MData::IEEE754::Tools=:all -le"$,=qq(\t); map { print $_, ulp($_ +) } @ARGV" 0.25 0.4 0.5 0.6 0.9 1 1.9 2 0.25 5.55111512312578e-017 0.4 5.55111512312578e-017 0.5 1.11022302462516e-016 0.6 1.11022302462516e-016 0.9 1.11022302462516e-016 1 2.22044604925031e-016 1.9 2.22044604925031e-016 2 4.44089209850063e-016

This can also be seen in your 1+1/2**x by printing the underlying IEEE754, or by using a powers-of-two representation of the float, or by always using %.16f

perl -MData::IEEE754::Tools=:all -e"printf qq(%-3d %-32.32s 0x%-16s %. +16f %s\n), $_, 1+1/2**$_, hexstr754_from_double(1+1/2**$_), 1+1/2**$_ +, to_dec_floatingpoint(1+1/2**$_) for @ARGV" 47 48 49 50 51 52 53 54 +55 56 47 1.00000000000001 0x3FF0000000000020 1.000000000000 +0071 +0d1.0000000000000071p+0000 48 1 0x3FF0000000000010 1.000000000000 +0036 +0d1.0000000000000036p+0000 49 1 0x3FF0000000000008 1.000000000000 +0018 +0d1.0000000000000018p+0000 50 1 0x3FF0000000000004 1.000000000000 +0009 +0d1.0000000000000009p+0000 51 1 0x3FF0000000000002 1.000000000000 +0004 +0d1.0000000000000004p+0000 52 1 0x3FF0000000000001 1.000000000000 +0002 +0d1.0000000000000002p+0000 53 1 0x3FF0000000000000 1.000000000000 +0000 +0d1.0000000000000000p+0000 54 1 0x3FF0000000000000 1.000000000000 +0000 +0d1.0000000000000000p+0000 55 1 0x3FF0000000000000 1.000000000000 +0000 +0d1.0000000000000000p+0000 56 1 0x3FF0000000000000 1.000000000000 +0000 +0d1.0000000000000000p+0000

for numbers from 0.5 to 0.9999..., it's one better:

perl -MData::IEEE754::Tools=:all -e"printf qq(%-3d %-32.32s 0x%-16s %. +16f %s\n), $_, 0.5+1/2**$_, hexstr754_from_double(0.5+1/2**$_), 0.5+1 +/2**$_, to_dec_floatingpoint(0.5+1/2**$_) for @ARGV" 47 48 49 50 51 5 +2 53 54 55 56 47 0.500000000000007 0x3FE0000000000040 0.500000000000 +0071 +0d1.0000000000000142p-0001 48 0.500000000000004 0x3FE0000000000020 0.500000000000 +0036 +0d1.0000000000000071p-0001 49 0.500000000000002 0x3FE0000000000010 0.500000000000 +0018 +0d1.0000000000000036p-0001 50 0.500000000000001 0x3FE0000000000008 0.500000000000 +0009 +0d1.0000000000000018p-0001 51 0.5 0x3FE0000000000004 0.500000000000 +0004 +0d1.0000000000000009p-0001 52 0.5 0x3FE0000000000002 0.500000000000 +0002 +0d1.0000000000000004p-0001 53 0.5 0x3FE0000000000001 0.500000000000 +0001 +0d1.0000000000000002p-0001 54 0.5 0x3FE0000000000000 0.500000000000 +0000 +0d1.0000000000000000p-0001 55 0.5 0x3FE0000000000000 0.500000000000 +0000 +0d1.0000000000000000p-0001 56 0.5 0x3FE0000000000000 0.500000000000 +0000 +0d1.0000000000000000p-0001 perl -MData::IEEE754::Tools=:all -e"printf qq(%-3d %-32.32s 0x%-16s %. +16f %s\n), $_, 1.0-1/2**$_, hexstr754_from_double(1-1/2**$_), 1-1/2** +$_, to_dec_floatingpoint(1-1/2**$_) for @ARGV" 47 48 49 50 51 52 53 5 +4 55 56 47 0.999999999999993 0x3FEFFFFFFFFFFFC0 0.999999999999 +9929 +0d1.9999999999999858p-0001 48 0.999999999999996 0x3FEFFFFFFFFFFFE0 0.999999999999 +9965 +0d1.9999999999999929p-0001 49 0.999999999999998 0x3FEFFFFFFFFFFFF0 0.999999999999 +9982 +0d1.9999999999999964p-0001 50 0.999999999999999 0x3FEFFFFFFFFFFFF8 0.999999999999 +9991 +0d1.9999999999999982p-0001 51 1 0x3FEFFFFFFFFFFFFC 0.999999999999 +9996 +0d1.9999999999999991p-0001 52 1 0x3FEFFFFFFFFFFFFE 0.999999999999 +9998 +0d1.9999999999999996p-0001 53 1 0x3FEFFFFFFFFFFFFF 0.999999999999 +9999 +0d1.9999999999999998p-0001 54 1 0x3FF0000000000000 1.000000000000 +0000 +0d1.0000000000000000p+0000 55 1 0x3FF0000000000000 1.000000000000 +0000 +0d1.0000000000000000p+0000 56 1 0x3FF0000000000000 1.000000000000 +0000 +0d1.0000000000000000p+0000

In reply to Re^6: inclusive rand by pryrt
in thread inclusive rand by msh210

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.