Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Aug 2002 06:50:04 -0700 (PDT)
From:      Jens Schweikhardt <schweikh@schweikhardt.net>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/41823: printf("%+f\n", -0.0) generates +0.000000
Message-ID:  <200208251350.g7PDo4W4088825@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/41823; it has been noted by GNATS.

From: Jens Schweikhardt <schweikh@schweikhardt.net>
To: Bruce Evans <bde@zeta.org.au>
Cc: GNATS Bug Followup <bug-followup@FreeBSD.org>
Subject: Re: bin/41823: printf("%+f\n", -0.0) generates +0.000000
Date: Sun, 25 Aug 2002 15:31:21 +0200

 On Thu, Aug 22, 2002 at 09:36:30AM +1000, Bruce Evans wrote:
 ...
 # % ===================================================================
 # % RCS file: /home/ncvs/src/lib/libc/stdio/vfprintf.c,v
 # % retrieving revision 1.43
 # % diff -u -r1.43 vfprintf.c
 # % --- src/lib/libc/stdio/vfprintf.c	15 Aug 2002 10:28:52 -0000	1.43
 # % +++ src/lib/libc/stdio/vfprintf.c	21 Aug 2002 11:17:14 -0000
 # % @@ -1409,13 +1409,13 @@
 # %  			ndigits++;
 # %  		mode = 2;		/* ndigits significant digits */
 # %  	}
 # % -	if (value < 0) {
 # % +	digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve,
 # % +			dtoaresultp);
 # % +	if (dsgn) {
 # %  		value = -value;
 # %  		*sign = '-';
 # %  	} else
 # %  		*sign = '\000';
 # % -	digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve,
 # % -			dtoaresultp);
 # %  	if ((ch != 'g' && ch != 'G') || flags & ALT) {
 # %  		/* print trailing zeros */
 # %  		bp = digits + ndigits;
 # %
 # 
 # Style bugs:
 # new:
 #     negating "value" after using it is bogus.  (It is used later, but only
 #     as a boolean.)
 # old:
 #     don't need to split the __dtoa() line.
 # very old (in rev.1.1):
 #     *sign is a really a boolean, so setting to character values is bogus.
 #     (It is named *softsign in the only caller and used to set a variable
 #     named "sign" which really holds a character value there.  The caller
 #     also spells '\0' normally.  Actually that '\0' is really a boolean
 #     too -- it never gets printed for obvious reasons.)
 
 Ok, here's a patch you'll like -- it reduces the lines of code :-)
 
 Index: vfprintf.c
 ===================================================================
 RCS file: /home/ncvs/src/lib/libc/stdio/vfprintf.c,v
 retrieving revision 1.43
 diff -u -r1.43 vfprintf.c
 --- vfprintf.c	15 Aug 2002 10:28:52 -0000	1.43
 +++ vfprintf.c	25 Aug 2002 13:26:08 -0000
 @@ -1409,13 +1409,8 @@
  			ndigits++;
  		mode = 2;		/* ndigits significant digits */
  	}
 -	if (value < 0) {
 -		value = -value;
 -		*sign = '-';
 -	} else
 -		*sign = '\000';
 -	digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve,
 -			dtoaresultp);
 +	digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve, dtoaresultp);
 +	*sign = dsgn != 0;
  	if ((ch != 'g' && ch != 'G') || flags & ALT) {
  		/* print trailing zeros */
  		bp = digits + ndigits;
 
 Regards,
 
 	Jens
 -- 
 Jens Schweikhardt http://www.schweikhardt.net/
 SIGSIG -- signature too long (core dumped)

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200208251350.g7PDo4W4088825>