analog: sane printing of very small and negative values

This commit is contained in:
Bert Vermeulen 2012-10-16 14:03:40 +02:00
parent 8ed262509f
commit d713e56181
1 changed files with 20 additions and 14 deletions

View File

@ -63,21 +63,27 @@ static int init(struct sr_output *o)
static void si_printf(float value, GString *out, char *unitstr) static void si_printf(float value, GString *out, char *unitstr)
{ {
float v;
if (value > 1000000000L) if (signbit(value))
g_string_append_printf(out, "%f G%s", value / 1000000000L, unitstr); v = -(value);
else if (value > 1000000) else
g_string_append_printf(out, "%f M%s", value / 1000000, unitstr); v = value;
else if (value > 1000)
g_string_append_printf(out, "%f k%s", value / 1000, unitstr); if (v < 1e-12 || v > 1e+12)
else if (value < 0.000000000001) g_string_append_printf(out, "%f %s", value, unitstr);
g_string_append_printf(out, "%f p%s", value * 1000000000000, unitstr); else if (v > 1e+9)
else if (value < 0.000000001) g_string_append_printf(out, "%f G%s", value / 1e+9, unitstr);
g_string_append_printf(out, "%f n%s", value * 1000000000, unitstr); else if (v > 1e+6)
else if (value < 0.000001) g_string_append_printf(out, "%f M%s", value / 1e+6, unitstr);
g_string_append_printf(out, "%f u%s", value * 1000000, unitstr); else if (v > 1e+3)
else if (value < 0.001) g_string_append_printf(out, "%f k%s", value / 1e+3, unitstr);
g_string_append_printf(out, "%f m%s", value * 1000, unitstr); else if (v < 1e-9)
g_string_append_printf(out, "%f n%s", value * 1e+9, unitstr);
else if (v < 1e-6)
g_string_append_printf(out, "%f u%s", value * 1e+6, unitstr);
else if (v < 1e-3)
g_string_append_printf(out, "%f m%s", value * 1e+3, unitstr);
else else
g_string_append_printf(out, "%f %s", value, unitstr); g_string_append_printf(out, "%f %s", value, unitstr);