Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20140407180426.GD26358@brightrain.aerifal.cx>
Date: Mon, 7 Apr 2014 14:04:26 -0400
From: Rich Felker <dalias@...ifal.cx>
To: musl@...ts.openwall.com
Subject: Re: printf issues

On Mon, Apr 07, 2014 at 05:36:11PM +0200, Szabolcs Nagy wrote:
> * 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

Thanks for making the analysis needed to fix this. I've committed the
fix. Hopefully this is the last of such bugs. Perhaps we should devise
a stress test with random inputs and assertions to search for other
bugs. Some ideas that come to mind:

1. Printing both full-precision and roundings to 0...25 places and
   asserting that the roundings are correct based on the full-prec.

2. For full precision outputs, asserting that sum(digits)%3 ==
   numerator%3 for diadic rationals of the form numerator/denominator.

3. Round tripping with strtold.

4. Assertions about formatting such as lack of trailing zeros.

...?

Rich

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.