[Issue 5229] New: Inaccurate parsing of floating-point literals

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Nov 17 03:30:56 PST 2010


http://d.puremagic.com/issues/show_bug.cgi?id=5229

           Summary: Inaccurate parsing of floating-point literals
           Product: D
           Version: D1 & D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: wrong-code
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: bugzilla at kyllingen.net


--- Comment #0 from Lars T. Kyllingstad <bugzilla at kyllingen.net> 2010-11-17 03:29:34 PST ---
80-bit reals give you roughly 19 decimal digits of precision.  Thus, for a
given number, 20 digits should usually be enough to ensure that the literal
gets mapped to the closest representable number.

The following program shows that this is not always the case.  Here, 23 digits
is needed to get the closest representable number to pi^2, even though the
approximation to pi^2 itself is only accurate to 18 digits!

Test case:

    void main()
    {
        // Approximations to pi^2, accurate to 18 digits:
        real closest = 0x9.de9e64df22ef2d2p+0L;
        real next    = 0x9.de9e64df22ef2d3p+0L;

        // A literal with 23 digits maps to the correct
        // representation.
        real dig23 = 9.86960_44010_89358_61883_45L;
        assert (dig23 == closest);

        // 22 digits should also be (more than) sufficient,
        // but no...
        real dig22 = 9.86960_44010_89358_61883_5L;
        assert (dig22 == closest);  // Fails; should pass
        assert (dig22 == next);     // Passes; should fail
    }

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list