cvs commit: src/lib/libc/stdio floatio.h vfprintf.c

Tim Robbins tjr at FreeBSD.ORG
Sat Apr 5 23:49:00 PST 2003


On Sat, Apr 05, 2003 at 02:11:42PM -0800, David Schultz wrote:

> das         2003/04/05 14:11:42 PST
> 
>   FreeBSD src repository
> 
>   Modified files:
>     lib/libc/stdio       floatio.h vfprintf.c 
>   Log:
>   Rework the floating point code in printf().  Significant changes:
>   
>   - We used to round long double arguments to double.  Now we print
>     them properly.
>   
>   - Bugs involving '%F', corner cases of '#' and 'g' format
>     specifiers, and the '.*' precision specifier have been
>     fixed.
>   
>   - Added support for the "'" specifier to print thousands' grouping
>     characters in a locale-dependent manner.
>   
>   - Implement the __vfprintf() side of hexadecimal floating point
>     support.  All that is still needed is a routine to convert the
>     mantissa to hex digits one nibble at a time in the style of ultoa().

I think there is a bug here. I've attached a small test program that mimics
the behaviour of top's "CPU states" display. Here are the results on 4.x:

CPU states:  0.0% user
CPU states: 10.0% user
CPU states: 20.0% user
CPU states: 30.0% user
CPU states: 40.0% user
CPU states: 50.0% user
CPU states: 60.0% user
CPU states: 70.0% user
CPU states: 80.0% user
CPU states: 90.0% user
CPU states:  100%
CPU states:  110%
CPU states:  120%
CPU states:  130%
CPU states:  140%

Here are the results on -current now:

CPU states:  0.0% user
CPU states: 10.00% user
CPU states: 20.00% user
CPU states: 30.00% user
CPU states: 40.00% user
CPU states: 50.00% user
CPU states: 60.00% user
CPU states: 70.00% user
CPU states: 80.00% user
CPU states: 90.00% user
CPU states:  10000%
CPU states:  1100%
CPU states:  1200%
CPU states:  1300%
CPU states:  1400%

If you can't reproduce this problem yourself, it's possible that I've broken
something here with all my wide char changes.



Tim
-------------- next part --------------
#include <stdio.h>

int
main(int argc, char *argv[])
{
	int i;

	for (i = 0; i < 150; i += 10)
		printf(i >= 100 ? "CPU states: %4.0f%%\n" :
		    "CPU states: %4.1f%% user\n", (double)i);

	exit(0);
}


More information about the cvs-src mailing list