\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 - \mathsf{log1p}\left(\mathsf{expm1}\left(\cos \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}{\cos \phi_2 \cdot \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right) + \cos \phi_1}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r38990 = lambda1;
double r38991 = phi2;
double r38992 = cos(r38991);
double r38993 = lambda2;
double r38994 = r38990 - r38993;
double r38995 = sin(r38994);
double r38996 = r38992 * r38995;
double r38997 = phi1;
double r38998 = cos(r38997);
double r38999 = cos(r38994);
double r39000 = r38992 * r38999;
double r39001 = r38998 + r39000;
double r39002 = atan2(r38996, r39001);
double r39003 = r38990 + r39002;
return r39003;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r39004 = lambda1;
double r39005 = phi2;
double r39006 = cos(r39005);
double r39007 = sin(r39004);
double r39008 = lambda2;
double r39009 = cos(r39008);
double r39010 = r39007 * r39009;
double r39011 = cos(r39004);
double r39012 = sin(r39008);
double r39013 = r39011 * r39012;
double r39014 = expm1(r39013);
double r39015 = log1p(r39014);
double r39016 = r39010 - r39015;
double r39017 = r39006 * r39016;
double r39018 = r39007 * r39012;
double r39019 = fma(r39009, r39011, r39018);
double r39020 = r39006 * r39019;
double r39021 = phi1;
double r39022 = cos(r39021);
double r39023 = r39020 + r39022;
double r39024 = atan2(r39017, r39023);
double r39025 = r39004 + r39024;
return r39025;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.7
Simplified0.7
rmApplied sin-diff0.7
rmApplied sub-neg0.7
Applied cos-sum0.2
Simplified0.2
rmApplied log1p-expm1-u0.2
rmApplied fma-udef0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2020045 +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)))))))