mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
ff969cd5c8
commit
b286ea638c
2 changed files with 19 additions and 13 deletions
25
dive.c
25
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 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;
|
const struct divecomputer *dc = &dive->dc;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (dc->surface_pressure.mbar) {
|
if (!dc->surface_pressure.mbar)
|
||||||
pressure = (double)(count * pressure + dc->surface_pressure.mbar) / (count + 1) + 0.5;
|
continue;
|
||||||
count++;
|
sum += dc->surface_pressure.mbar;
|
||||||
}
|
count++;
|
||||||
dc = dc->next;
|
} while ((dc = dc->next) != NULL);
|
||||||
} while (dc);
|
|
||||||
if (!pressure && non_null)
|
/* Did we have any dive computers with surface pressure information */
|
||||||
pressure = SURFACE_PRESSURE;
|
if (count)
|
||||||
return pressure;
|
return (sum + count/2) / count;
|
||||||
|
|
||||||
|
if (non_null)
|
||||||
|
return SURFACE_PRESSURE;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_temperature(temperature_t *temperature, int new)
|
static void update_temperature(temperature_t *temperature, int new)
|
||||||
|
|
|
@ -539,7 +539,7 @@ static void show_single_dive_stats(struct dive *dive)
|
||||||
double value;
|
double value;
|
||||||
int decimals;
|
int decimals;
|
||||||
const char *unit;
|
const char *unit;
|
||||||
int idx, offset, gas_used;
|
int idx, offset, gas_used, mbar;
|
||||||
struct dive *prev_dive;
|
struct dive *prev_dive;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
|
|
||||||
|
@ -579,8 +579,9 @@ static void show_single_dive_stats(struct dive *dive)
|
||||||
} else {
|
} else {
|
||||||
set_label(single_w.air_temp, "");
|
set_label(single_w.air_temp, "");
|
||||||
}
|
}
|
||||||
if (get_surface_pressure_in_mbar(dive, FALSE)) {
|
mbar = get_surface_pressure_in_mbar(dive, FALSE);
|
||||||
set_label(single_w.air_press, "%d mbar", dive->dc.surface_pressure.mbar);
|
if (mbar) {
|
||||||
|
set_label(single_w.air_press, "%d mbar", mbar);
|
||||||
} else {
|
} else {
|
||||||
set_label(single_w.air_press, _("unknown"));
|
set_label(single_w.air_press, _("unknown"));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue