[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#209136: libc6: printf %#.0g incorrect output



GOTO Masanori writes:
 > At Sun, 07 Sep 2003 23:51:40 -0400,
 > Jerry Quinn wrote:
 > > Philip Blundell writes:
 > >  > On Sun, 2003-09-07 at 23:29, Jerry Quinn wrote:
 > >  > > printf("%#.0g", d) gives incorrect results in a couple of cases.
 > >  > > The first case has an extra 0 at the end.  The second case should be a
 > >  > > fixed point output according to the manpage, not scientific output.
 > >  > 
 > >  > Please supply a test program that illustrates this behaviour.  You need
 > >  > to explain exactly what output you see, and what (presumably different)
 > >  > output you feel would be correct.
 > > 
 > > I thought I had.  I had used the reportbug attach, but apparently the
 > > test got lost.  Here's the test program.  The output I get is:
 > > 
 > > 0.0010
 > > 1.e-04
 > > 
 > > Reading the manpage for printf makes me believe that these are wrong.
 > > Note this is on x86, using gcc 2.95.  Using a recent snapshot of gcc
 > > 3.4 gives the same result.
 > 
 > This is not printf bug, but math issue.  And your variable is not
 > appropriate.  Please try and report.

The changed numbers work fine.

The question, then, is - what is wrong with the numbers in my test
case?  I thought any combination of 64 bits is a valid ieee double.

The test case came up because I'm working on printing routines for
libstdc++, so I was trying to test it against printf using random
doubles to make sure everything works correctly.

 > > #include <stdio.h>
 > > #include <stdlib.h>
 > > 
 > > int main(void)
 > > {
 > >   union fpstruct {
 > >     double d;
 > >     long x[2];
 > >   } fd;
 > > 
 > >   fd.x[0]=0x96576b7b; fd.x[1]=0xbf4f519a;
 >     fd.x[0]=0xd2f1a9fc; fd.x[1]=0x3f50624d;
 > 
 > >   // This should print 0.001
 > >   printf("%#.0g\n", fd.d);
 > >  
 > >   fd.x[0]=0x674bf7a8; fd.x[1]=0x3f19c5d7;
 >     fd.x[0]=0xeb1c432d; fd.x[1]=0x3f1a36e2;
 > 
 > >   printf("%f\n", fd.d);
 > >   // This should print 0.0001, since exp is -04 according to manpage
 > >   printf("%#.0g\n", fd.d);
 > > }
 > 
 > Regards,
 > -- gotom

Thanks,
Jerry



Reply to: