R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68838 = R;
double r68839 = lambda1;
double r68840 = lambda2;
double r68841 = r68839 - r68840;
double r68842 = phi1;
double r68843 = phi2;
double r68844 = r68842 + r68843;
double r68845 = 2.0;
double r68846 = r68844 / r68845;
double r68847 = cos(r68846);
double r68848 = r68841 * r68847;
double r68849 = r68848 * r68848;
double r68850 = r68842 - r68843;
double r68851 = r68850 * r68850;
double r68852 = r68849 + r68851;
double r68853 = sqrt(r68852);
double r68854 = r68838 * r68853;
return r68854;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68855 = lambda1;
double r68856 = lambda2;
double r68857 = r68855 - r68856;
double r68858 = phi1;
double r68859 = phi2;
double r68860 = r68858 + r68859;
double r68861 = 2.0;
double r68862 = r68860 / r68861;
double r68863 = cos(r68862);
double r68864 = expm1(r68863);
double r68865 = log1p(r68864);
double r68866 = r68857 * r68865;
double r68867 = r68858 - r68859;
double r68868 = hypot(r68866, r68867);
double r68869 = R;
double r68870 = r68868 * r68869;
return r68870;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.1
Simplified3.5
rmApplied *-un-lft-identity3.5
rmApplied log1p-expm1-u3.5
Final simplification3.5
herbie shell --seed 2019235 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
:precision binary64
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))