|
|
Message-ID: <20140407153611.GM3034@port70.net>
Date: Mon, 7 Apr 2014 17:36:11 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: printf issues
* Morten Welinder <mwelinder@...il.com> [2014-04-07 10:13:26 -0400]:
> The frequency of this problem is something like 1 in 5e6.
> Observations:
>
> * I only seem to be able to trigger it for %g even though all my
> samples print in "e" form.
>
> * The numbers are all roughly the same size: 1e15
>
> * The numbers are all integers ending in 05. (Except two cases
> where the 05 is followed by zeros.)
>
> * The precision is always just below the value that would have
> make an exact representation.
printf("%.12g\n", 1000000000005.0);
printf("%.11g\n", 500000000045.0);
printf("%.11g\n", 275000000025.0);
prints
1.00000000001e+12
5.0000000005e+11
2.7500000003e+11
in fmt_fp
if (x || d+1!=z) {
long double round = CONCAT(0x1p,LDBL_MANT_DIG);
long double small;
if (*d/i & 1) round += 2;
if (x<i/2) small=0x0.8p0;
else if (x==i/2 && d+1==z) small=0x1.0p0;
else small=0x1.8p0;
...
here
i == 10
x == *d%i == 5 == i/2
but the half-way case does not trigger because z-d == 2 instead of 1
and z[-1] == 0 which should not happen here
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.