\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) + \log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right) \cdot \cos \phi_2}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r44781 = lambda1;
double r44782 = phi2;
double r44783 = cos(r44782);
double r44784 = lambda2;
double r44785 = r44781 - r44784;
double r44786 = sin(r44785);
double r44787 = r44783 * r44786;
double r44788 = phi1;
double r44789 = cos(r44788);
double r44790 = cos(r44785);
double r44791 = r44783 * r44790;
double r44792 = r44789 + r44791;
double r44793 = atan2(r44787, r44792);
double r44794 = r44781 + r44793;
return r44794;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r44795 = lambda1;
double r44796 = phi2;
double r44797 = cos(r44796);
double r44798 = sin(r44795);
double r44799 = lambda2;
double r44800 = cos(r44799);
double r44801 = r44798 * r44800;
double r44802 = cos(r44795);
double r44803 = sin(r44799);
double r44804 = r44802 * r44803;
double r44805 = r44801 - r44804;
double r44806 = r44797 * r44805;
double r44807 = r44800 * r44797;
double r44808 = phi1;
double r44809 = cos(r44808);
double r44810 = fma(r44802, r44807, r44809);
double r44811 = exp(r44810);
double r44812 = log(r44811);
double r44813 = r44798 * r44803;
double r44814 = exp(r44813);
double r44815 = log(r44814);
double r44816 = r44815 * r44797;
double r44817 = r44812 + r44816;
double r44818 = atan2(r44806, r44817);
double r44819 = r44795 + r44818;
return r44819;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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