Fix rounding issue due to non-associative floating arithmetic

Failing test
features/car/traffic_turn_penalties.feature:33

Tables were not identical:
    from |     to |     route |     speed |     time
|     a |     h |     ad,dhk,dhk |     63 km/h |     11.5s +-1 |
|     i |     g |     fim,fg,fg |     59 km/h |     12s  +-1 |
| (-) a | (-) e | (-) ad,de,de | (-) 57 km/h | (-) 12.5s +-1 |
| (+) a | (+) e | (+) ad,de,de | (+) 58 km/h | (+) 12.5s +-1 |
|     c |     g |     cd,de,ef,fg,fg |     63 km/h |     23s +-1 |
|     p |     g |     mp,fim,fg,fg |     61 km/h |     23.5s +-1 |
|     a |     l |     ad,dhk,kl,kl |     60 km/h |     24s +-1 |
|     l |     e |     kl,dhk,de,de |     59 km/h |     24.5s +-1 |
|     g |     n |     fg,fim,mn,mn |     57 km/h |     25s +-1 |
This commit is contained in:
Michael Krasnyk 2016-06-05 14:10:36 +02:00
parent 911d1e81b6
commit 3881ead8e5
No known key found for this signature in database
GPG Key ID: 3854C9454FE00649

View File

@ -276,10 +276,13 @@ Coordinate interpolateLinear(double factor, const Coordinate from, const Coordin
{
BOOST_ASSERT(0 <= factor && factor <= 1.0);
FixedLongitude interpolated_lon(((1. - factor) * static_cast<std::int32_t>(from.lon)) +
(factor * static_cast<std::int32_t>(to.lon)));
FixedLatitude interpolated_lat(((1. - factor) * static_cast<std::int32_t>(from.lat)) +
(factor * static_cast<std::int32_t>(to.lat)));
const auto from_lon = static_cast<std::int32_t>(from.lon);
const auto from_lat = static_cast<std::int32_t>(from.lat);
const auto to_lon = static_cast<std::int32_t>(to.lon);
const auto to_lat = static_cast<std::int32_t>(to.lat);
FixedLongitude interpolated_lon(from_lon + factor * (to_lon - from_lon));
FixedLatitude interpolated_lat(from_lat + factor * (to_lat - from_lat));
return {std::move(interpolated_lon), std::move(interpolated_lat)};
}