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:
parent
d56fbfd415
commit
524136d709
1 changed files with 34 additions and 14 deletions
|
@ -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';
|
||||
|
|
Loading…
Add table
Reference in a new issue