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 - \lambda_2 \leq -1.9759046280288937 \cdot 10^{+177}:\\
\;\;\;\;R \cdot \left(\lambda_2 \cdot \sqrt{\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right) \cdot \log \left(e^{\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)}\right)} - \lambda_1 \cdot \sqrt{\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right) \cdot \log \left(e^{\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)}\right)}\right)\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -3.34465013438458 \cdot 10^{+88}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -3.0263213508390754 \cdot 10^{+71}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \sqrt[3]{{\cos \left(\frac{\phi_2 + \phi_1}{2}\right)}^{3}}\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -1.1864276945228447 \cdot 10^{+25} \lor \neg \left(\lambda_1 - \lambda_2 \leq -1.320279479473137 \cdot 10^{-59}\right):\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;R \cdot \sqrt{\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \frac{\left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right) \cdot \left(\left(\left(\lambda_1 + \lambda_2\right) \cdot \left(\lambda_1 + \lambda_2\right)\right) \cdot {\left(\lambda_1 - \lambda_2\right)}^{2}\right)}{\left(\lambda_1 + \lambda_2\right) \cdot \left(\lambda_1 + \lambda_2\right)}}\\
\end{array}(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(*
R
(sqrt
(+
(*
(* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))
(* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))))
(* (- phi1 phi2) (- phi1 phi2))))))(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(if (<= (- lambda1 lambda2) -1.9759046280288937e+177)
(*
R
(-
(*
lambda2
(sqrt
(*
(cos (* 0.5 (+ phi2 phi1)))
(log (exp (cos (* 0.5 (+ phi2 phi1))))))))
(*
lambda1
(sqrt
(*
(cos (* 0.5 (+ phi2 phi1)))
(log (exp (cos (* 0.5 (+ phi2 phi1))))))))))
(if (<= (- lambda1 lambda2) -3.34465013438458e+88)
(* R (- phi2 phi1))
(if (<= (- lambda1 lambda2) -3.0263213508390754e+71)
(*
R
(sqrt
(+
(*
(* (- lambda1 lambda2) (cos (/ (+ phi2 phi1) 2.0)))
(*
(- lambda1 lambda2)
(cbrt (pow (cos (/ (+ phi2 phi1) 2.0)) 3.0))))
(* (- phi1 phi2) (- phi1 phi2)))))
(if (or (<= (- lambda1 lambda2) -1.1864276945228447e+25)
(not (<= (- lambda1 lambda2) -1.320279479473137e-59)))
(* R (- phi2 phi1))
(*
R
(sqrt
(+
(* (- phi1 phi2) (- phi1 phi2))
(/
(*
(* (cos (/ (+ phi2 phi1) 2.0)) (cos (/ (+ phi2 phi1) 2.0)))
(*
(* (+ lambda1 lambda2) (+ lambda1 lambda2))
(pow (- lambda1 lambda2) 2.0)))
(* (+ lambda1 lambda2) (+ lambda1 lambda2)))))))))))double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return R * sqrt((((lambda1 - lambda2) * cos((phi1 + phi2) / 2.0)) * ((lambda1 - lambda2) * cos((phi1 + phi2) / 2.0))) + ((phi1 - phi2) * (phi1 - phi2)));
}
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if ((lambda1 - lambda2) <= -1.9759046280288937e+177) {
tmp = R * ((lambda2 * sqrt(cos(0.5 * (phi2 + phi1)) * log(exp(cos(0.5 * (phi2 + phi1)))))) - (lambda1 * sqrt(cos(0.5 * (phi2 + phi1)) * log(exp(cos(0.5 * (phi2 + phi1)))))));
} else if ((lambda1 - lambda2) <= -3.34465013438458e+88) {
tmp = R * (phi2 - phi1);
} else if ((lambda1 - lambda2) <= -3.0263213508390754e+71) {
tmp = R * sqrt((((lambda1 - lambda2) * cos((phi2 + phi1) / 2.0)) * ((lambda1 - lambda2) * cbrt(pow(cos((phi2 + phi1) / 2.0), 3.0)))) + ((phi1 - phi2) * (phi1 - phi2)));
} else if (((lambda1 - lambda2) <= -1.1864276945228447e+25) || !((lambda1 - lambda2) <= -1.320279479473137e-59)) {
tmp = R * (phi2 - phi1);
} else {
tmp = R * sqrt(((phi1 - phi2) * (phi1 - phi2)) + (((cos((phi2 + phi1) / 2.0) * cos((phi2 + phi1) / 2.0)) * (((lambda1 + lambda2) * (lambda1 + lambda2)) * pow((lambda1 - lambda2), 2.0))) / ((lambda1 + lambda2) * (lambda1 + lambda2))));
}
return tmp;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (-.f64 lambda1 lambda2) < -1.9759046280288937e177Initial program 64.0
rmApplied add-log-exp_binary64_148164.0
Simplified64.0
Taylor expanded around -inf 20.3
if -1.9759046280288937e177 < (-.f64 lambda1 lambda2) < -3.34465013438458023e88 or -3.0263213508390754e71 < (-.f64 lambda1 lambda2) < -1.18642769452284472e25 or -1.320279479473137e-59 < (-.f64 lambda1 lambda2) Initial program 29.5
Taylor expanded around -inf 20.2
if -3.34465013438458023e88 < (-.f64 lambda1 lambda2) < -3.0263213508390754e71Initial program 23.6
rmApplied add-cbrt-cube_binary64_147823.6
Simplified23.6
if -1.18642769452284472e25 < (-.f64 lambda1 lambda2) < -1.320279479473137e-59Initial program 21.7
rmApplied flip--_binary64_141721.7
Applied associate-*l/_binary64_138521.7
Applied flip--_binary64_141721.7
Applied associate-*l/_binary64_138521.7
Applied frac-times_binary64_145221.7
Simplified21.7
Simplified21.7
Final simplification20.6
herbie shell --seed 2021060
(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.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))