Average Error: 0 → 0
Time: 6.4m
Precision: 64
\[\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}\]
\[\lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_2}{\mathsf{fma}\left(\left(\cos \phi_2\right), \left(\cos \left(\lambda_1 - \lambda_2\right)\right), \left(\cos \phi_1\right)\right)}\]
\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}
\lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_2}{\mathsf{fma}\left(\left(\cos \phi_2\right), \left(\cos \left(\lambda_1 - \lambda_2\right)\right), \left(\cos \phi_1\right)\right)}
double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r723386 = lambda1;
        double r723387 = phi2;
        double r723388 = cos(r723387);
        double r723389 = lambda2;
        double r723390 = r723386 - r723389;
        double r723391 = sin(r723390);
        double r723392 = r723388 * r723391;
        double r723393 = phi1;
        double r723394 = cos(r723393);
        double r723395 = cos(r723390);
        double r723396 = r723388 * r723395;
        double r723397 = r723394 + r723396;
        double r723398 = atan2(r723392, r723397);
        double r723399 = r723386 + r723398;
        return r723399;
}

double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r723400 = lambda1;
        double r723401 = lambda2;
        double r723402 = r723400 - r723401;
        double r723403 = sin(r723402);
        double r723404 = phi2;
        double r723405 = cos(r723404);
        double r723406 = r723403 * r723405;
        double r723407 = cos(r723402);
        double r723408 = phi1;
        double r723409 = cos(r723408);
        double r723410 = fma(r723405, r723407, r723409);
        double r723411 = atan2(r723406, r723410);
        double r723412 = r723400 + r723411;
        return r723412;
}

Error

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 0

    \[\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}\]
  2. Simplified0

    \[\leadsto \color{blue}{\tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\mathsf{fma}\left(\left(\cos \phi_2\right), \left(\cos \left(\lambda_1 - \lambda_2\right)\right), \left(\cos \phi_1\right)\right)} + \lambda_1}\]
  3. Final simplification0

    \[\leadsto \lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_2}{\mathsf{fma}\left(\left(\cos \phi_2\right), \left(\cos \left(\lambda_1 - \lambda_2\right)\right), \left(\cos \phi_1\right)\right)}\]

Reproduce

herbie shell --seed 2019132 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
  :name "Midpoint on a great circle"
  (+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))