(adjust_value): New function.

(human_readable_inexact): Apply rounding style even when printing
approximate values.
This commit is contained in:
Paul Eggert
2000-06-15 18:11:13 +00:00
parent c9dfa7a7e8
commit c61d0787ce

View File

@@ -76,6 +76,23 @@ static const char suffixes[] =
'Y' /* Yotta */
};
/* If INEXACT_STYLE is not human_round_to_even, and if easily
possible, adjust VALUE according to the style. */
static double
adjust_value (enum human_inexact_style inexact_style, double value)
{
/* Do not use the floor or ceil functions, as that would mean
linking with the standard math library, which is a porting pain.
So leave the value alone if it is too large to easily round. */
if (inexact_style != human_round_to_even && value < (uintmax_t) -1)
{
uintmax_t u = value;
value = u + (inexact_style == human_ceiling && u != value);
}
return value;
}
/* Like human_readable_inexact, except always round to even. */
char *
human_readable (uintmax_t n, char *buf,
@@ -173,7 +190,7 @@ human_readable_inexact (uintmax_t n, char *buf,
double damt = n * (from_block_size / (double) to_block_size);
if (! base)
sprintf (buf, "%.0f", damt);
sprintf (buf, "%.0f", adjust_value (inexact_style, damt));
else
{
double e = 1;
@@ -188,9 +205,12 @@ human_readable_inexact (uintmax_t n, char *buf,
damt /= e;
sprintf (buf, "%.1f%c", damt, suffixes[power]);
sprintf (buf, "%.1f%c", adjust_value (inexact_style, damt),
suffixes[power]);
if (4 < strlen (buf))
sprintf (buf, "%.0f%c", damt, suffixes[power]);
sprintf (buf, "%.0f%c",
adjust_value (inexact_style, damt * 10) / 10,
suffixes[power]);
}
return buf;