]> git.mxchange.org Git - flightgear.git/commitdiff
Minor rounding error fix for the latitude and longitude strings.
authorEdward d'Auvergne <edward@nmr-relax.com>
Wed, 2 Dec 2015 15:16:32 +0000 (16:16 +0100)
committerEdward d'Auvergne <edward@nmr-relax.com>
Wed, 2 Dec 2015 16:48:02 +0000 (17:48 +0100)
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.

src/Main/fg_props.cxx

index 42128b644a2dc481ed67e65351aa54d691dea081..1bd1035e1722b02811ee12135001d73754ddf77e 100644 (file)
@@ -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';