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 <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Linus Torvalds 2013-02-09 10:23:15 +11:00 committed by Dirk Hohndel
parent ff969cd5c8
commit b286ea638c
2 changed files with 19 additions and 13 deletions

25
dive.c
View file

@ -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)