\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]{\mathsf{fma}\left(\cos \lambda_1, \cos \phi_2 \cdot \cos \lambda_2, \cos \phi_1\right)} \cdot \sqrt[3]{\mathsf{fma}\left(\cos \lambda_1, \cos \phi_2 \cdot \cos \lambda_2, \cos \phi_1\right) \cdot \mathsf{fma}\left(\cos \lambda_1, \cos \phi_2 \cdot \cos \lambda_2, \cos \phi_1\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 r54974 = lambda1;
double r54975 = phi2;
double r54976 = cos(r54975);
double r54977 = lambda2;
double r54978 = r54974 - r54977;
double r54979 = sin(r54978);
double r54980 = r54976 * r54979;
double r54981 = phi1;
double r54982 = cos(r54981);
double r54983 = cos(r54978);
double r54984 = r54976 * r54983;
double r54985 = r54982 + r54984;
double r54986 = atan2(r54980, r54985);
double r54987 = r54974 + r54986;
return r54987;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r54988 = lambda1;
double r54989 = phi2;
double r54990 = cos(r54989);
double r54991 = sin(r54988);
double r54992 = lambda2;
double r54993 = cos(r54992);
double r54994 = r54991 * r54993;
double r54995 = cos(r54988);
double r54996 = sin(r54992);
double r54997 = r54995 * r54996;
double r54998 = r54994 - r54997;
double r54999 = r54990 * r54998;
double r55000 = r54990 * r54993;
double r55001 = phi1;
double r55002 = cos(r55001);
double r55003 = fma(r54995, r55000, r55002);
double r55004 = cbrt(r55003);
double r55005 = r55003 * r55003;
double r55006 = cbrt(r55005);
double r55007 = r55004 * r55006;
double r55008 = r54991 * r54996;
double r55009 = r54990 * r55008;
double r55010 = r55007 + r55009;
double r55011 = atan2(r54999, r55010);
double r55012 = r54988 + r55011;
return r55012;
}



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
Applied distribute-lft-in0.2
Applied associate-+r+0.2
Simplified0.2
rmApplied add-cbrt-cube0.3
Simplified0.3
rmApplied cube-mult0.3
Applied cbrt-prod0.4
Final simplification0.4
herbie shell --seed 2020047 +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)))))))