\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\right) + \cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)}{\mathsf{fma}\left(\cos \lambda_1 \cdot \cos \lambda_2, \cos \phi_2, \cos \phi_1\right) + \left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r42804 = lambda1;
double r42805 = phi2;
double r42806 = cos(r42805);
double r42807 = lambda2;
double r42808 = r42804 - r42807;
double r42809 = sin(r42808);
double r42810 = r42806 * r42809;
double r42811 = phi1;
double r42812 = cos(r42811);
double r42813 = cos(r42808);
double r42814 = r42806 * r42813;
double r42815 = r42812 + r42814;
double r42816 = atan2(r42810, r42815);
double r42817 = r42804 + r42816;
return r42817;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r42818 = lambda1;
double r42819 = phi2;
double r42820 = cos(r42819);
double r42821 = sin(r42818);
double r42822 = lambda2;
double r42823 = cos(r42822);
double r42824 = r42821 * r42823;
double r42825 = r42820 * r42824;
double r42826 = cos(r42818);
double r42827 = -r42822;
double r42828 = sin(r42827);
double r42829 = r42826 * r42828;
double r42830 = r42820 * r42829;
double r42831 = r42825 + r42830;
double r42832 = r42826 * r42823;
double r42833 = phi1;
double r42834 = cos(r42833);
double r42835 = fma(r42832, r42820, r42834);
double r42836 = sin(r42822);
double r42837 = r42821 * r42836;
double r42838 = r42837 * r42820;
double r42839 = r42835 + r42838;
double r42840 = atan2(r42831, r42839);
double r42841 = r42818 + r42840;
return r42841;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.8
rmApplied sub-neg0.8
Applied sin-sum0.8
Applied distribute-lft-in0.8
Simplified0.8
rmApplied cos-diff0.2
Applied distribute-rgt-in0.2
Applied associate-+r+0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019303 +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)))))))