[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