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(\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r7488928 = R;
double r7488929 = lambda1;
double r7488930 = lambda2;
double r7488931 = r7488929 - r7488930;
double r7488932 = phi1;
double r7488933 = phi2;
double r7488934 = r7488932 + r7488933;
double r7488935 = 2.0;
double r7488936 = r7488934 / r7488935;
double r7488937 = cos(r7488936);
double r7488938 = r7488931 * r7488937;
double r7488939 = r7488938 * r7488938;
double r7488940 = r7488932 - r7488933;
double r7488941 = r7488940 * r7488940;
double r7488942 = r7488939 + r7488941;
double r7488943 = sqrt(r7488942);
double r7488944 = r7488928 * r7488943;
return r7488944;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r7488945 = phi1;
double r7488946 = phi2;
double r7488947 = r7488945 + r7488946;
double r7488948 = 2.0;
double r7488949 = r7488947 / r7488948;
double r7488950 = cos(r7488949);
double r7488951 = lambda1;
double r7488952 = lambda2;
double r7488953 = r7488951 - r7488952;
double r7488954 = r7488950 * r7488953;
double r7488955 = r7488945 - r7488946;
double r7488956 = hypot(r7488954, r7488955);
double r7488957 = R;
double r7488958 = r7488956 * r7488957;
return r7488958;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 38.7
Simplified3.6
rmApplied *-commutative3.6
Final simplification3.6
herbie shell --seed 2019173 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))