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)}\begin{array}{l}
\mathbf{if}\;\lambda_1 \le -6.214547549450306169998240250610611825087 \cdot 10^{127}:\\
\;\;\;\;\left(\lambda_2 - \lambda_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\frac{\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \left(\log \left(e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_2 + \lambda_1\right)\right)\right)}{\lambda_2 + \lambda_1} \cdot \left(\lambda_1 - \lambda_2\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)} \cdot R\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r113969 = R;
double r113970 = lambda1;
double r113971 = lambda2;
double r113972 = r113970 - r113971;
double r113973 = phi1;
double r113974 = phi2;
double r113975 = r113973 + r113974;
double r113976 = 2.0;
double r113977 = r113975 / r113976;
double r113978 = cos(r113977);
double r113979 = r113972 * r113978;
double r113980 = r113979 * r113979;
double r113981 = r113973 - r113974;
double r113982 = r113981 * r113981;
double r113983 = r113980 + r113982;
double r113984 = sqrt(r113983);
double r113985 = r113969 * r113984;
return r113985;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r113986 = lambda1;
double r113987 = -6.214547549450306e+127;
bool r113988 = r113986 <= r113987;
double r113989 = lambda2;
double r113990 = r113989 - r113986;
double r113991 = R;
double r113992 = r113990 * r113991;
double r113993 = phi1;
double r113994 = phi2;
double r113995 = r113993 + r113994;
double r113996 = 2.0;
double r113997 = r113995 / r113996;
double r113998 = cos(r113997);
double r113999 = exp(r113998);
double r114000 = log(r113999);
double r114001 = r113986 - r113989;
double r114002 = r113989 + r113986;
double r114003 = r114001 * r114002;
double r114004 = r114000 * r114003;
double r114005 = r113998 * r114004;
double r114006 = r114005 / r114002;
double r114007 = r114006 * r114001;
double r114008 = r113993 - r113994;
double r114009 = r114008 * r114008;
double r114010 = r114007 + r114009;
double r114011 = sqrt(r114010);
double r114012 = r114011 * r113991;
double r114013 = r113988 ? r113992 : r114012;
return r114013;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if lambda1 < -6.214547549450306e+127Initial program 60.0
Simplified60.0
Taylor expanded around 0 43.0
if -6.214547549450306e+127 < lambda1 Initial program 36.4
Simplified36.4
rmApplied flip--36.4
Applied associate-*l/36.4
Applied associate-*l/36.4
Simplified36.4
rmApplied add-log-exp36.4
Final simplification37.3
herbie shell --seed 2019196
(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))))))