summaryrefslogtreecommitdiffstats
path: root/core/device.c
diff options
context:
space:
mode:
authorGravatar Jeremie Guichard <djebrest@gmail.com>2017-03-09 23:07:30 +0700
committerGravatar Jeremie Guichard <djebrest@gmail.com>2017-03-09 23:07:30 +0700
commit2b06a0b2234cf2779f80e87038011067be282bcb (patch)
tree7532b11736a5eaedb3ceddf3e85ee423948d47ce /core/device.c
parent406e4287eb96e10ddfd22163f0e863e353470c68 (diff)
downloadsubsurface-2b06a0b2234cf2779f80e87038011067be282bcb.tar.gz
Fix potential double/float to int rounding errors
Not using lrint(f) when converting double/float to int creates rounding errors. This error was detected by TestParse::testParseDM4 failure on Windows. It was creating rounding inconsistencies on Linux too, see change in TestDiveDM4.xml. Enable -Wfloat-conversion for gcc version greater than 4.9.0 Signed-off-by: Jeremie Guichard <djebrest@gmail.com>
Diffstat (limited to 'core/device.c')
-rw-r--r--core/device.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/core/device.c b/core/device.c
index 86c30dbd9..e20aecb5a 100644
--- a/core/device.c
+++ b/core/device.c
@@ -64,10 +64,10 @@
static int fill_samples(struct sample *s, int max_d, int avg_d, int max_t, double slope, double d_frac)
{
double t_frac = max_t * (1 - avg_d / (double)max_d);
- int t1 = max_d / slope;
- int t4 = max_t - t1 * d_frac;
- int t3 = t4 - (t_frac - t1) / (1 - d_frac);
- int t2 = t3 - t1 * (1 - d_frac);
+ int t1 = lrint(max_d / slope);
+ int t4 = lrint(max_t - t1 * d_frac);
+ int t3 = lrint(t4 - (t_frac - t1) / (1 - d_frac));
+ int t2 = lrint(t3 - t1 * (1 - d_frac));
if (t1 < 0 || t1 > t2 || t2 > t3 || t3 > t4 || t4 > max_t)
return 0;
@@ -77,9 +77,9 @@ static int fill_samples(struct sample *s, int max_d, int avg_d, int max_t, doubl
s[2].time.seconds = t2;
s[2].depth.mm = max_d;
s[3].time.seconds = t3;
- s[3].depth.mm = max_d * d_frac;
+ s[3].depth.mm = lrint(max_d * d_frac);
s[4].time.seconds = t4;
- s[4].depth.mm = max_d * d_frac;
+ s[4].depth.mm = lrint(max_d * d_frac);
return 1;
}
@@ -92,18 +92,18 @@ static void fill_samples_no_avg(struct sample *s, int max_d, int max_t, double s
{
// shallow or short dives are just trapecoids based on the given slope
if (max_d < 10000 || max_t < 600) {
- s[1].time.seconds = max_d / slope;
+ s[1].time.seconds = lrint(max_d / slope);
s[1].depth.mm = max_d;
- s[2].time.seconds = max_t - max_d / slope;
+ s[2].time.seconds = max_t - lrint(max_d / slope);
s[2].depth.mm = max_d;
} else {
- s[1].time.seconds = max_d / slope;
+ s[1].time.seconds = lrint(max_d / slope);
s[1].depth.mm = max_d;
- s[2].time.seconds = max_t - max_d / slope - 180;
+ s[2].time.seconds = max_t - lrint(max_d / slope) - 180;
s[2].depth.mm = max_d;
- s[3].time.seconds = max_t - 5000 / slope - 180;
+ s[3].time.seconds = max_t - lrint(5000 / slope) - 180;
s[3].depth.mm = 5000;
- s[4].time.seconds = max_t - 5000 / slope;
+ s[4].time.seconds = max_t - lrint(5000 / slope);
s[4].depth.mm = 5000;
}
}