From: Edward d'Auvergne Date: Wed, 2 Dec 2015 15:16:32 +0000 (+0100) Subject: Minor rounding error fix for the latitude and longitude strings. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=524136d709680416ed7e1ef981bf9e50aba186eb;p=flightgear.git Minor rounding error fix for the latitude and longitude strings. This is for the FGProperties::getLongitudeString() and FGProperties::getLatitudeString() functions. The previous algorithm was to round the degrees up by the smallest fraction required to prevent a round up to 60 minutes or seconds, and then round down the final minutes or seconds by the same fraction. The new algorithm is to detect if the final minute or seconds will be rounded to 60 by the string formatting and, if so, the higher unit (degrees or minutes) is incremented by one, and the lower unit decremented by 60. --- diff --git a/src/Main/fg_props.cxx b/src/Main/fg_props.cxx index 42128b644..1bd1035e1 100644 --- a/src/Main/fg_props.cxx +++ b/src/Main/fg_props.cxx @@ -400,18 +400,28 @@ FGProperties::getLongitudeString () // dd mm.mmm' (DMM-Format) -- uses a round-off factor tailored to the // required precision of the minutes field (three decimal places), // preventing minute values of 60. - double deg = d + 5.0E-4 / 60.0; - double min = (deg - int(deg)) * 60.0 - 4.999E-4; - snprintf(buf, 32, "%d*%06.3f%c", int(deg), min, c); + double min = (d - int(d)) * 60.0; + if (min >= 59.9995) { + min -= 60.0; + d += 1.0; + } + snprintf(buf, 32, "%d*%06.3f%c", int(d), fabs(min), c); } else { // mm'ss.s'' (DMS-Format) -- uses a round-off factor tailored to the // required precision of the seconds field (one decimal place), // preventing second values of 60. - double deg = d + 0.05 / 3600.0; - double min = (deg - int(deg)) * 60.0; - double sec = (min - int(min)) * 60.0 - 0.049; - snprintf(buf, 32, "%d*%02d %04.1f%c", int(deg), + double min = (d - int(d)) * 60.0; + double sec = (min - int(min)) * 60.0; + if (sec >= 59.95) { + sec -= 60.0; + min += 1.0; + if (min >= 60.0) { + min -= 60.0; + d += 1.0; + } + } + snprintf(buf, 32, "%d*%02d %04.1f%c", int(d), int(min), fabs(sec), c); } buf[31] = '\0'; @@ -431,15 +441,25 @@ FGProperties::getLatitudeString () snprintf(buf, 32, "%3.6f%c", d, c); } else if (format == 1) { - double deg = d + 5.0E-4 / 60.0; - double min = (deg - int(deg)) * 60.0 - 4.999E-4; - snprintf(buf, 32, "%d*%06.3f%c", int(deg), min, c); + double min = (d - int(d)) * 60.0; + if (min >= 59.9995) { + min -= 60.0; + d += 1.0; + } + snprintf(buf, 32, "%d*%06.3f%c", int(d), fabs(min), c); } else { - double deg = d + 0.05 / 3600.0; - double min = (deg - int(deg)) * 60.0; - double sec = (min - int(min)) * 60.0 - 0.049; - snprintf(buf, 32, "%d*%02d %04.1f%c", int(deg), + double min = (d - int(d)) * 60.0; + double sec = (min - int(min)) * 60.0; + if (sec >= 59.95) { + sec -= 60.0; + min += 1.0; + if (min >= 60.0) { + min -= 60.0; + d += 1.0; + } + } + snprintf(buf, 32, "%d*%02d %04.1f%c", int(d), int(min), fabs(sec), c); } buf[31] = '\0';