\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{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right)}{\sqrt[3]{{\left(\mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right), \cos \phi_1\right)\right)}^{3}}}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r59403 = lambda1;
double r59404 = phi2;
double r59405 = cos(r59404);
double r59406 = lambda2;
double r59407 = r59403 - r59406;
double r59408 = sin(r59407);
double r59409 = r59405 * r59408;
double r59410 = phi1;
double r59411 = cos(r59410);
double r59412 = cos(r59407);
double r59413 = r59405 * r59412;
double r59414 = r59411 + r59413;
double r59415 = atan2(r59409, r59414);
double r59416 = r59403 + r59415;
return r59416;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r59417 = lambda1;
double r59418 = phi2;
double r59419 = cos(r59418);
double r59420 = sin(r59417);
double r59421 = lambda2;
double r59422 = cos(r59421);
double r59423 = r59420 * r59422;
double r59424 = cos(r59417);
double r59425 = sin(r59421);
double r59426 = r59424 * r59425;
double r59427 = r59423 - r59426;
double r59428 = r59419 * r59427;
double r59429 = r59420 * r59425;
double r59430 = fma(r59424, r59422, r59429);
double r59431 = phi1;
double r59432 = cos(r59431);
double r59433 = fma(r59419, r59430, r59432);
double r59434 = 3.0;
double r59435 = pow(r59433, r59434);
double r59436 = cbrt(r59435);
double r59437 = atan2(r59428, r59436);
double r59438 = r59417 + r59437;
return r59438;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.9
rmApplied sin-diff0.8
rmApplied cos-diff0.2
rmApplied add-cbrt-cube0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020060 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Midpoint on a great circle"
:precision binary64
(+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))