\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 \left(-\lambda_2\right)\right)}{\frac{\mathsf{fma}\left({\left(\cos \phi_2\right)}^{3}, {\left(\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right)\right)}^{3}, {\left(\cos \phi_1\right)}^{3}\right)}{\mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\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)\right), \cos \phi_1 \cdot \cos \phi_1\right)}}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r58831 = lambda1;
double r58832 = phi2;
double r58833 = cos(r58832);
double r58834 = lambda2;
double r58835 = r58831 - r58834;
double r58836 = sin(r58835);
double r58837 = r58833 * r58836;
double r58838 = phi1;
double r58839 = cos(r58838);
double r58840 = cos(r58835);
double r58841 = r58833 * r58840;
double r58842 = r58839 + r58841;
double r58843 = atan2(r58837, r58842);
double r58844 = r58831 + r58843;
return r58844;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r58845 = lambda1;
double r58846 = phi2;
double r58847 = cos(r58846);
double r58848 = sin(r58845);
double r58849 = lambda2;
double r58850 = cos(r58849);
double r58851 = r58848 * r58850;
double r58852 = cos(r58845);
double r58853 = -r58849;
double r58854 = sin(r58853);
double r58855 = r58852 * r58854;
double r58856 = r58851 + r58855;
double r58857 = r58847 * r58856;
double r58858 = 3.0;
double r58859 = pow(r58847, r58858);
double r58860 = sin(r58849);
double r58861 = r58848 * r58860;
double r58862 = fma(r58852, r58850, r58861);
double r58863 = pow(r58862, r58858);
double r58864 = phi1;
double r58865 = cos(r58864);
double r58866 = pow(r58865, r58858);
double r58867 = fma(r58859, r58863, r58866);
double r58868 = -r58865;
double r58869 = fma(r58847, r58862, r58868);
double r58870 = expm1(r58869);
double r58871 = log1p(r58870);
double r58872 = r58862 * r58871;
double r58873 = r58865 * r58865;
double r58874 = fma(r58847, r58872, r58873);
double r58875 = r58867 / r58874;
double r58876 = atan2(r58857, r58875);
double r58877 = r58845 + r58876;
return r58877;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.8
rmApplied cos-diff0.8
rmApplied sub-neg0.8
Applied sin-sum0.2
Simplified0.2
rmApplied flip3-+0.3
Simplified0.3
Simplified0.3
rmApplied log1p-expm1-u0.3
Final simplification0.3
herbie shell --seed 2020001 +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)))))))