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{expm1}\left(\mathsf{log1p}\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 r68849 = R;
double r68850 = lambda1;
double r68851 = lambda2;
double r68852 = r68850 - r68851;
double r68853 = phi1;
double r68854 = phi2;
double r68855 = r68853 + r68854;
double r68856 = 2.0;
double r68857 = r68855 / r68856;
double r68858 = cos(r68857);
double r68859 = r68852 * r68858;
double r68860 = r68859 * r68859;
double r68861 = r68853 - r68854;
double r68862 = r68861 * r68861;
double r68863 = r68860 + r68862;
double r68864 = sqrt(r68863);
double r68865 = r68849 * r68864;
return r68865;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68866 = lambda1;
double r68867 = lambda2;
double r68868 = r68866 - r68867;
double r68869 = phi1;
double r68870 = phi2;
double r68871 = r68869 + r68870;
double r68872 = 2.0;
double r68873 = r68871 / r68872;
double r68874 = cos(r68873);
double r68875 = log1p(r68874);
double r68876 = expm1(r68875);
double r68877 = r68868 * r68876;
double r68878 = r68869 - r68870;
double r68879 = hypot(r68877, r68878);
double r68880 = R;
double r68881 = r68879 * r68880;
return r68881;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.2
Simplified3.8
rmApplied expm1-log1p-u3.8
Final simplification3.8
herbie shell --seed 2019304 +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))))))