bug in calcru()

Don Lewis truckman at FreeBSD.org
Mon Jan 31 20:02:59 PST 2005


On 26 Jan, Chris Landauer wrote:
> 
> hihi, doug -
> 
>> Doug Ambrisko <ambrisko at ambrisko.com> wrote
>>	...
>>	The assumption with this calculation is that st & it tend to be
>>	small compared to tt so the 1024 X shouldn't overflow much.
>>	...
>> cal at aero.org wrote:
>> |	...but i'm a little worried that the 1024 multiplications aren't
>> |	large enough when tt gets really large
>> | > Doug Ambrisko <ambrisko at ambrisko.com> wrote
>> | >     ...
>> | >     /* Subdivide tu. try to becareful of overflow */
>> | >     su = tu * (st * 1024 / tt) / 1024;
>> | >     iu = tu * (it * 1024 / tt) / 1024;
>> | >     uu = tu - (su + iu);
>> | >     ...
> 
> i'm not so worried about the overflow limit (that's what the mathematical
> analysis is intended to discover, and i assume that the bound is large enough
> to ignore the issue - that is the really clever part about computing su and iu
> first instead of uu), but the underflow - if st and it are small enough and tt
> is large enough, these equations produce 0 for both su and iu (and the
> reported percentage will rightly be 0.00%, but i want to see the rest of the
> detail for my time models)

It looks like the worst case for overflow would be if st == tt or it ==
tt, and even then overflow would not happen until the run time got up
above 500 years according to my calculations, so it would probably be
safe to increase the 1024 factor by quite a bit.  Even at 1024, the
system and interrupt time will be calculated to about 0.1%, though you
might want to tweak the formula a bit to do rounding.
	su = tu * ((st * 1024 + 512) / tt) / 1024;



More information about the freebsd-hackers mailing list