From b286ea638c8ce468cf9c1a1b5037867acb5d6fe4 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 9 Feb 2013 10:23:15 +1100 Subject: Simplify/clarify the get_surface_pressure_in_mbar() function Instead of maintaining a rolling average and re-calculating it at each stage, just calculate the surface_pressure average the natural way: as the sum divided by the number of entries. This results in a single rounding, rather than doing rounding multiple times and possibly rounding wrong as a result. Not that we care all that deeply about the LSB of the mbar value, but the code is simpler and more obvious this way too. Signed-off-by: Linus Torvalds Signed-off-by: Dirk Hohndel --- dive.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'dive.c') diff --git a/dive.c b/dive.c index 7083e857c..cbee208ec 100644 --- a/dive.c +++ b/dive.c @@ -232,18 +232,23 @@ int get_duration_in_sec(struct dive *dive) int get_surface_pressure_in_mbar(const struct dive *dive, gboolean non_null) { - int count = 0, pressure = 0; + unsigned int count = 0, sum = 0; const struct divecomputer *dc = &dive->dc; + do { - if (dc->surface_pressure.mbar) { - pressure = (double)(count * pressure + dc->surface_pressure.mbar) / (count + 1) + 0.5; - count++; - } - dc = dc->next; - } while (dc); - if (!pressure && non_null) - pressure = SURFACE_PRESSURE; - return pressure; + if (!dc->surface_pressure.mbar) + continue; + sum += dc->surface_pressure.mbar; + count++; + } while ((dc = dc->next) != NULL); + + /* Did we have any dive computers with surface pressure information */ + if (count) + return (sum + count/2) / count; + + if (non_null) + return SURFACE_PRESSURE; + return 0; } static void update_temperature(temperature_t *temperature, int new) -- cgit v1.2.3-70-g09d2