1
0
Fork 0

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.
This commit is contained in:
Edward d'Auvergne 2015-12-02 16:16:32 +01:00
parent d56fbfd415
commit 524136d709

View 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';