Date: Sun, 4 Oct 1998 13:24:41 +0300 (IDT) From: Eli Zaretskii X-Sender: eliz AT is To: DJ Delorie cc: djgpp-workers AT delorie DOT com Subject: Patch for _doprnt to print -0.000 and -NaN Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII The following patch for doprnt.c corrects the problem with printing signs of 0.000 and NaN. After this patch, if you request the sign in the format specifier (with the `+' flag), you will see the true sign of both 0.000 numbers and NaNs. *** src/libc/ansi/stdio/doprnt.c~0 Sun Jul 12 15:30:42 1998 --- src/libc/ansi/stdio/doprnt.c Fri Oct 2 12:48:52 1998 *************** _doprnt(const char *fmt0, va_list argp, *** 96,101 **** --- 96,102 ---- char softsign; /* temporary negative sign for floats */ const char *digs; /* digits for [diouxX] conversion */ char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ + int neg_ldouble = 0; /* non-zero if _ldouble is negative */ decimal = localeconv()->decimal_point[0]; *************** _doprnt(const char *fmt0, va_list argp, *** 247,255 **** --- 248,260 ---- { softsign = '-'; _ldouble = -_ldouble; + neg_ldouble = 1; } else + { softsign = 0; + neg_ldouble = 0; + } /* * cvt may have to round up past the "start" of the * buffer, i.e. ``intf("%.2f", (double)9.999);''; *************** _doprnt(const char *fmt0, va_list argp, *** 258,264 **** *buf = NULL; size = cvtl(_ldouble, prec, flags, &softsign, *fmt, buf, buf + sizeof(buf)); ! if (softsign && !nan) sign = '-'; nan = 0; t = *buf ? buf : buf + 1; --- 263,275 ---- *buf = NULL; size = cvtl(_ldouble, prec, flags, &softsign, *fmt, buf, buf + sizeof(buf)); ! /* ! * 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. ! */ ! if (softsign || (sign == '+' && (neg_ldouble || nan == -1))) sign = '-'; nan = 0; t = *buf ? buf : buf + 1; *************** isspeciall(long double d, char *bufp) *** 857,864 **** if ((ip->manh & 0x7fffffff) || ip->manl) { strcpy(bufp, "NaN"); ! nan = 1; /* kludge: we don't need the sign, it's not nice ! but it should work */ } else (void)strcpy(bufp, "Inf"); --- 868,875 ---- if ((ip->manh & 0x7fffffff) || ip->manl) { strcpy(bufp, "NaN"); ! nan = ip->sign ? -1 : 1; /* kludge: we don't need the sign, it's not nice ! but it should work */ } else (void)strcpy(bufp, "Inf"); *** src/docs/kb/wc202.t~1 Tue Sep 29 11:51:12 1998 --- src/docs/kb/wc202.txi Fri Oct 2 12:59:26 1998 *************** will be disabled inside blocks that call *** 459,461 **** --- 459,473 ---- @cindex SIGALRM @cindex SIGPROF @cindex profiling + + The functions of the @code{printf} family now always print a negative + sign for a negative floating-point argument, even when the conversion + generated no significant digits (i.e. only zeros are printed), if the + format specifier requests an explicit sign, like in "%+f". A special + NaN value will also be printed with a sign in these cases (e.g. try + printing @code{-nanf()}). + @findex printf + @findex fprintf + @findex sprintf + @findex _doprnt + @findex nanf