www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2014/01/06/18:08:09

X-Authentication-Warning: delorie.com: mail set sender to djgpp-workers-bounces using -f
X-Recipient: djgpp-workers AT delorie DOT com
Message-ID: <52CB29B1.3010904@gmx.de>
Date: Mon, 06 Jan 2014 23:09:53 +0100
From: Juan Manuel Guerrero <juan DOT guerrero AT gmx DOT de>
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0
MIME-Version: 1.0
To: djgpp-workers AT delorie DOT com
Subject: _doprnt bug fix if mantissa fraction precision exceeds the default
of 39 decimal digits.
X-Provags-ID: V03:K0:3RbRuydr3n4uAJlwmV1qGk4wAopyIPwptVs5H5pjmIX6p0MZhQw
XVhaOXaYUKM8HhQ43w49k4BQN+9y6mDUjcbOfVREBoio1nsG/yYVn7Jykh/q7pVthreVbQz
sarTzP/0ANwo6z9Px5yXdNEoHCHQsQ44w9QbXY0shaZq2Rd4Tl6I/I4wdipRvHen9RdWgKg
9NS/GfEvdvdh7XPFrf6CA==
Reply-To: djgpp-workers AT delorie DOT com

Please look at the following code snippet:

#include <stdio.h>

int main(void)
{
   printf("%.60Le\n", 1.75L);
   return 0;
}


It must produce the following output (linux):
1.750000000000000000000000000000000000000000000000000000000000e+00
but it produces the following output:
1.750000000000000000000000000000000000000e+00000000000000000000000

_doprnt limits the precision to 39 decimal digits.  If a larger precision has
been specified then zeros are added to the end of the conversion string
instead to the end of the fraction part coded in the conversion string.
The code above is from a test case of libunistring-0.9.3.tar.gz that
fails for DJGPP 2.03 and 2.04.  This bug appears only if the specified
precision really exceeds 39 [hex]decimal digits.  Precision larger than 39 digits
are seldom.
The patch below will fix the issue.

As usual suggestions, objections, comments are welcome.

Regards,
Juan M. Guerrero


2014-01-06  Juan Manuel Guerrero  <juan DOT guerrero AT gmx DOT de>


     * djgpp/src/libc/ansi/stdio/doprnt.c:  Handle case when mantissa fraction precision exceeds max default precision of 39 decimal digits.






diff -aprNU5 djgpp.orig/src/libc/ansi/stdio/doprnt.c djgpp/src/libc/ansi/stdio/doprnt.c
--- djgpp.orig/src/libc/ansi/stdio/doprnt.c    2014-01-06 18:54:44 +0000
+++ djgpp/src/libc/ansi/stdio/doprnt.c    2014-01-06 22:44:06 +0000
@@ -1,5 +1,6 @@
+/* Copyright (C) 2014 DJ Delorie, see COPYING.DJ for details */
  /* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */
  /* Copyright (C) 2012 DJ Delorie, see COPYING.DJ for details */
  /* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */
  /* Copyright (C) 2008 DJ Delorie, see COPYING.DJ for details */
  /* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */
@@ -404,12 +405,13 @@ rflag:
         * cvt may have to round up past the "start" of the
         * buffer, i.e. ``intf("%.2f", (double)9.999);'';
         * if the first char isn't NUL, it did.
         */
        *buf = '\0';
-      size = doprnt_cvtl(_ldouble, prec, flags, &softsign, *fmt, buf,
+      size = doprnt_cvtl(_ldouble, prec + fpprec, flags, &softsign, *fmt, buf,
                           buf + sizeof(buf));
+      fpprec = 0;  /* Floating point fraction precision greater than 39 digits already adjusted in doprnt_cvtl.  */
        /*
         * If the format specifier requested an explicit sign,
         * we print a negative sign even if no significant digits
         * will be shown, and we also print a sign for a NaN.  In
         * other words, "%+f" might print -0.000000, +NaN and -NaN.

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019