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}\;\phi_2 \le 1.400742996618376 \cdot 10^{-20}:\\
\;\;\;\;\sqrt{\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\log \left(e^{\cos \left(\frac{\phi_2 + \phi_1}{2}\right)}\right) \cdot \left(\lambda_1 - \lambda_2\right)\right)} \cdot R\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4161169 = R;
double r4161170 = lambda1;
double r4161171 = lambda2;
double r4161172 = r4161170 - r4161171;
double r4161173 = phi1;
double r4161174 = phi2;
double r4161175 = r4161173 + r4161174;
double r4161176 = 2.0;
double r4161177 = r4161175 / r4161176;
double r4161178 = cos(r4161177);
double r4161179 = r4161172 * r4161178;
double r4161180 = r4161179 * r4161179;
double r4161181 = r4161173 - r4161174;
double r4161182 = r4161181 * r4161181;
double r4161183 = r4161180 + r4161182;
double r4161184 = sqrt(r4161183);
double r4161185 = r4161169 * r4161184;
return r4161185;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4161186 = phi2;
double r4161187 = 1.400742996618376e-20;
bool r4161188 = r4161186 <= r4161187;
double r4161189 = phi1;
double r4161190 = r4161189 - r4161186;
double r4161191 = r4161190 * r4161190;
double r4161192 = r4161186 + r4161189;
double r4161193 = 2.0;
double r4161194 = r4161192 / r4161193;
double r4161195 = cos(r4161194);
double r4161196 = lambda1;
double r4161197 = lambda2;
double r4161198 = r4161196 - r4161197;
double r4161199 = r4161195 * r4161198;
double r4161200 = exp(r4161195);
double r4161201 = log(r4161200);
double r4161202 = r4161201 * r4161198;
double r4161203 = r4161199 * r4161202;
double r4161204 = r4161191 + r4161203;
double r4161205 = sqrt(r4161204);
double r4161206 = R;
double r4161207 = r4161205 * r4161206;
double r4161208 = r4161186 - r4161189;
double r4161209 = r4161206 * r4161208;
double r4161210 = r4161188 ? r4161207 : r4161209;
return r4161210;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if phi2 < 1.400742996618376e-20Initial program 34.4
rmApplied add-log-exp34.4
if 1.400742996618376e-20 < phi2 Initial program 45.5
Taylor expanded around 0 27.6
Final simplification32.8
herbie shell --seed 2019158
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))