Date: Tue, 22 Mar 2011 12:27:19 +0000 From: Alexander Best <arundel@freebsd.org> To: d@delphij.net Cc: freebsd-bugs@FreeBSD.org Subject: Re: bin/146205: df(1) fails to display total space on a 100PB filesystem correctly Message-ID: <20110322122719.GA13777@freebsd.org> In-Reply-To: <20110322122541.GA13441@freebsd.org> References: <201103202210.p2KMA3dS053483@freefall.freebsd.org> <4D87CF77.8070304@delphij.net> <4D87F0FB.2050302@delphij.net> <20110322122541.GA13441@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue Mar 22 11, Alexander Best wrote: > On Mon Mar 21 11, Xin LI wrote: > > -----BEGIN PGP SIGNED MESSAGE----- > > Hash: SHA256 > > > > Revised version, I have mistakenly understood the old code, which only > > keeps one digit after the dot. > > with this patch running my example code with > > int64_t bytes = 6007692009979824 * 1024; > > returns "8E". with > > int64_t bytes = 2007692009979824 * 1024; > > however it returns "9E. this doesn't seem quite right. i haven't checked whether this behavior was introduced by your patch or poses another genuine humanzie_number(3) bug. cheers. alex > > > > > Cheers, > > - -- > > Xin LI <delphij@delphij.net> http://www.delphij.net/ > > FreeBSD - The Power to Serve! Live free or die > > -----BEGIN PGP SIGNATURE----- > > Version: GnuPG v2.0.17 (FreeBSD) > > > > iQEcBAEBCAAGBQJNh/D6AAoJEATO+BI/yjfBbDoH/25nmc7rQ914Rgfp2iVTBTCo > > 0J6D29V1tRfqFnzg62zYH23tsoQfcYI/gesx5TyegdCOpR1nOAEUl7T/UA4CmUuh > > CN54KNQ631WUT/V5Rndf5ikIcAnu7L5IP14RNGUWH5CJhi70OmrbWt3d2XKvLMvO > > Uhtq+Uhl/NyoGaq2tE9/WyGyeb70Ribzd4zE6hMVSSY9rPKASpCj3oSpAn7ioSms > > X9MvcUCM/eOQxLMYtq1PN6Dz5GPqewiBfmoOWNGssbYnhqotYpIKNUAkDeKUuFop > > P940nVkhhiSmsZPGD4W67fgKwXhxzj7Ukw7ru+XOp0z3afK6xxkkUQAvAfGop4g= > > =mx5z > > -----END PGP SIGNATURE----- > > > Index: humanize_number.c > > =================================================================== > > --- humanize_number.c (revision 219842) > > +++ humanize_number.c (working copy) > > @@ -47,8 +47,9 @@ > > const char *suffix, int scale, int flags) > > { > > const char *prefixes, *sep; > > - int b, i, r, maxscale, s1, s2, sign; > > + int i, r, maxscale, s1, s2, sign; > > int64_t divisor, max; > > + int64_t quotient = bytes, reminder = 0; > > size_t baselen; > > > > assert(buf != NULL); > > @@ -88,11 +89,10 @@ > > buf[0] = '\0'; > > if (bytes < 0) { > > sign = -1; > > - bytes *= -100; > > + quotient = -quotient; > > baselen = 3; /* sign, digit, prefix */ > > } else { > > sign = 1; > > - bytes *= 100; > > baselen = 2; /* digit, prefix */ > > } > > if (flags & HN_NOSPACE) > > @@ -109,7 +109,7 @@ > > > > if (scale & (HN_AUTOSCALE | HN_GETSCALE)) { > > /* See if there is additional columns can be used. */ > > - for (max = 100, i = len - baselen; i-- > 0;) > > + for (max = 1, i = len - baselen; i-- > 0;) > > max *= 10; > > > > /* > > @@ -117,29 +117,33 @@ > > * If there will be an overflow by the rounding below, > > * divide once more. > > */ > > - for (i = 0; bytes >= max - 50 && i < maxscale; i++) > > - bytes /= divisor; > > + for (i = 0; quotient > max && i < maxscale; i++) { > > + reminder = quotient % divisor; > > + quotient /= divisor; > > + } > > > > if (scale & HN_GETSCALE) > > return (i); > > - } else > > - for (i = 0; i < scale && i < maxscale; i++) > > - bytes /= divisor; > > + } else { > > + for (i = 0; i < scale && i < maxscale; i++) { > > + reminder = quotient % divisor; > > + quotient /= divisor; > > + } > > + } > > > > /* If a value <= 9.9 after rounding and ... */ > > - if (bytes < 995 && i > 0 && flags & HN_DECIMAL) { > > + if (quotient == 9 && reminder < 950 && i > 0 && flags & HN_DECIMAL) { > > /* baselen + \0 + .N */ > > if (len < baselen + 1 + 2) > > return (-1); > > - b = ((int)bytes + 5) / 10; > > - s1 = b / 10; > > - s2 = b % 10; > > + s1 = (int)quotient + (((int)reminder + 50) / 100); > > + s2 = (((int)reminder + 50) / 10) % 10; > > r = snprintf(buf, len, "%d%s%d%s%s%s", > > sign * s1, localeconv()->decimal_point, s2, > > sep, SCALE2PREFIX(i), suffix); > > } else > > r = snprintf(buf, len, "%" PRId64 "%s%s%s", > > - sign * ((bytes + 50) / 100), > > + sign * (quotient + (reminder + 50) / 100), > > sep, SCALE2PREFIX(i), suffix); > > > > return (r); > > > -- > a13x -- a13x
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110322122719.GA13777>