\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)}{\log \left(e^{\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2 \cdot \cos \phi_2, \cos \phi_1\right)}\right) + \cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r56836 = lambda1;
double r56837 = phi2;
double r56838 = cos(r56837);
double r56839 = lambda2;
double r56840 = r56836 - r56839;
double r56841 = sin(r56840);
double r56842 = r56838 * r56841;
double r56843 = phi1;
double r56844 = cos(r56843);
double r56845 = cos(r56840);
double r56846 = r56838 * r56845;
double r56847 = r56844 + r56846;
double r56848 = atan2(r56842, r56847);
double r56849 = r56836 + r56848;
return r56849;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r56850 = lambda1;
double r56851 = phi2;
double r56852 = cos(r56851);
double r56853 = sin(r56850);
double r56854 = lambda2;
double r56855 = cos(r56854);
double r56856 = r56853 * r56855;
double r56857 = cos(r56850);
double r56858 = sin(r56854);
double r56859 = r56857 * r56858;
double r56860 = r56856 - r56859;
double r56861 = r56852 * r56860;
double r56862 = r56855 * r56852;
double r56863 = phi1;
double r56864 = cos(r56863);
double r56865 = fma(r56857, r56862, r56864);
double r56866 = exp(r56865);
double r56867 = log(r56866);
double r56868 = r56853 * r56858;
double r56869 = r56852 * r56868;
double r56870 = r56867 + r56869;
double r56871 = atan2(r56861, r56870);
double r56872 = r56850 + r56871;
return r56872;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.9
rmApplied cos-diff0.9
Applied distribute-lft-in0.9
Applied associate-+r+0.9
Simplified0.9
rmApplied sin-diff0.2
rmApplied add-log-exp0.3
Final simplification0.3
herbie shell --seed 2020024 +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)))))))