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(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) - \mathsf{expm1}\left(\left(\sqrt[3]{\mathsf{log1p}\left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)} \cdot \sqrt[3]{\mathsf{log1p}\left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)}\right) \cdot \sqrt[3]{\mathsf{log1p}\left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)}\right)\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 r82950 = R;
double r82951 = lambda1;
double r82952 = lambda2;
double r82953 = r82951 - r82952;
double r82954 = phi1;
double r82955 = phi2;
double r82956 = r82954 + r82955;
double r82957 = 2.0;
double r82958 = r82956 / r82957;
double r82959 = cos(r82958);
double r82960 = r82953 * r82959;
double r82961 = r82960 * r82960;
double r82962 = r82954 - r82955;
double r82963 = r82962 * r82962;
double r82964 = r82961 + r82963;
double r82965 = sqrt(r82964);
double r82966 = r82950 * r82965;
return r82966;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r82967 = phi2;
double r82968 = 0.5;
double r82969 = r82967 * r82968;
double r82970 = cos(r82969);
double r82971 = phi1;
double r82972 = r82971 * r82968;
double r82973 = cos(r82972);
double r82974 = r82970 * r82973;
double r82975 = sin(r82969);
double r82976 = sin(r82972);
double r82977 = r82975 * r82976;
double r82978 = log1p(r82977);
double r82979 = cbrt(r82978);
double r82980 = r82979 * r82979;
double r82981 = r82980 * r82979;
double r82982 = expm1(r82981);
double r82983 = r82974 - r82982;
double r82984 = lambda1;
double r82985 = lambda2;
double r82986 = r82984 - r82985;
double r82987 = r82983 * r82986;
double r82988 = r82971 - r82967;
double r82989 = hypot(r82987, r82988);
double r82990 = R;
double r82991 = r82989 * r82990;
return r82991;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.4
Simplified3.7
Taylor expanded around inf 3.7
Simplified3.7
rmApplied distribute-lft-in3.7
Applied cos-sum0.1
Simplified0.1
Simplified0.1
rmApplied expm1-log1p-u0.1
rmApplied add-cube-cbrt0.2
Final simplification0.2
herbie shell --seed 2020027 +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))))))