[net.bugs.4bsd] roundoff bug in MON and iostat

ddj@brunix.UUCP (Dave Johnson) (01/19/85)

This is a minor bug I noticed in mon.  When the system has been up for
a couple days, the first idle time percentage often is printed as a
negative value, and the other percentages are incorrectly computed.
This was caused by integer truncation before a floating divide in
vm.c.   The first set of percentages, by the way, is the average
over the period since the system was booted.

This error was inherited from iostat.c, and can be fixed there just
as easily... there was a bug report in the MtXinu/USENIX bug list,
but no fix indication -- I've included the change to its offending
line at the end of this message.

	Dave Johnson
	Brown University Computer Science
	ddj@brown.csnet
	{allegra,decvax,linus,ihnp4}!brunix!ddj

afterthought:  Now that mon has been pretty stable for a few weeks,
it might be nice to post a complete shar distribution again with
all the fixes together.  A few people have mentioned having trouble
getting all the diffs from various contributors to run properly.
I have tried to keep up with the changes (though we missed about
two weeks of news in the last month for various reasons).
Have there been any further changes after these two?
    -----
    Message-ID: <220@unc.UUCP>
    From: sherouse@unc.UUCP (George W. Sherouse) Mon Dec 17 16:38:57 1984
    added user count
    -----
    Message-ID: <1552@ittvax.UUCP>
    From: long@ittvax.UUCP (H. Morrow Long) Thu Dec 20 21:40:41 1984
    added screen dump commands
    -----

NOTE: it is very important to do a clean make from source if you change
the include file, mon.h, while adding any of the patches floating around.
-------------------------
Fix for mon sources (Line numbers may vary due to individual patching habits)
diff vm.c.old vm.c:
129c129
<                 mvprintw(TIMEY+1,x,"%3.0f", 100 * s.cp_time[i]/t);
---
>                 mvprintw(TIMEY+1,x,"%3.0f", 100. * s.cp_time[i]/t);
132c132
< 	                mvprintw(TIMEY+1,x+27,"%3.0f", 100 * s.cp_time2[i]/t2);
---
> 	                mvprintw(TIMEY+1,x+27,"%3.0f", 100. * s.cp_time2[i]/t2);

Fix for 4.2 iostat.c:

diff /usr/src/usr.bin/iostat.c iostat.c:
210c210
< 	printf("%3.0f", 100*s.cp_time[o]/time);
---
> 	printf("%3.0f", 100.*s.cp_time[o]/time); /* ddj -- was missing '.' */