fixed 
AirspaceAircraftPerformance::SolutionVertical(fixed distance, fixed altitude,
                                              fixed base, fixed top,
                                              fixed &intercept_alt) const
{
  if (!SolutionExists(distance, altitude, base, top))
    return fixed(-1);

  if (top <= base) {
    // unique solution
    fixed t_this = SolutionGeneral(distance, altitude - top);
    if (t_this < fixed_big) {
      intercept_alt = top;
      return t_this;
    }
    return fixed(-1);
  }

  AirspaceAircraftInterceptVertical aaiv(*this, distance, altitude, base, top);
  return aaiv.solve(intercept_alt);
}
double
AirspaceAircraftPerformance::SolutionVertical(double distance, double altitude,
                                              double base, double top,
                                              double &intercept_alt) const
{
  if (!SolutionExists(distance, altitude, base, top))
    return -1;

  if (top <= base) {
    // unique solution
    auto t_this = SolutionGeneral(distance, altitude - top);
    if (t_this < BIG) {
      intercept_alt = top;
      return t_this;
    }
    return -1;
  }

  AirspaceAircraftInterceptVertical aaiv(*this, distance, altitude, base, top);
  return aaiv.solve(intercept_alt);
}