\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 r57789 = lambda1;
double r57790 = phi2;
double r57791 = cos(r57790);
double r57792 = lambda2;
double r57793 = r57789 - r57792;
double r57794 = sin(r57793);
double r57795 = r57791 * r57794;
double r57796 = phi1;
double r57797 = cos(r57796);
double r57798 = cos(r57793);
double r57799 = r57791 * r57798;
double r57800 = r57797 + r57799;
double r57801 = atan2(r57795, r57800);
double r57802 = r57789 + r57801;
return r57802;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r57803 = lambda1;
double r57804 = phi2;
double r57805 = cos(r57804);
double r57806 = sin(r57803);
double r57807 = lambda2;
double r57808 = cos(r57807);
double r57809 = r57806 * r57808;
double r57810 = cos(r57803);
double r57811 = sin(r57807);
double r57812 = r57810 * r57811;
double r57813 = r57809 - r57812;
double r57814 = r57805 * r57813;
double r57815 = r57806 * r57811;
double r57816 = fma(r57810, r57808, r57815);
double r57817 = phi1;
double r57818 = cos(r57817);
double r57819 = fma(r57805, r57816, r57818);
double r57820 = 3.0;
double r57821 = pow(r57819, r57820);
double r57822 = cbrt(r57821);
double r57823 = atan2(r57814, r57822);
double r57824 = r57803 + r57823;
return r57824;
}



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