Average Error: 0 → 0
Time: 6.2m
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 r341286 = lambda1;
        double r341287 = phi2;
        double r341288 = cos(r341287);
        double r341289 = lambda2;
        double r341290 = r341286 - r341289;
        double r341291 = sin(r341290);
        double r341292 = r341288 * r341291;
        double r341293 = phi1;
        double r341294 = cos(r341293);
        double r341295 = cos(r341290);
        double r341296 = r341288 * r341295;
        double r341297 = r341294 + r341296;
        double r341298 = atan2(r341292, r341297);
        double r341299 = r341286 + r341298;
        return r341299;
}

double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r341300 = lambda1;
        double r341301 = lambda2;
        double r341302 = r341300 - r341301;
        double r341303 = sin(r341302);
        double r341304 = phi2;
        double r341305 = cos(r341304);
        double r341306 = r341303 * r341305;
        double r341307 = cos(r341302);
        double r341308 = phi1;
        double r341309 = cos(r341308);
        double r341310 = fma(r341305, r341307, r341309);
        double r341311 = atan2(r341306, r341310);
        double r341312 = r341300 + r341311;
        return r341312;
}

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 2019128 +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)))))))