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}
t_0 := \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)\\
t_1 := \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\\
\mathbf{if}\;\begin{array}{l}
t_2 := R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot t_1\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot t_1\right) + t_0}\\
t_3 := \left(\lambda_1 - \lambda_2\right) \cdot t_1\\
t_2 \leq -\infty \lor \neg \left(t_2 \leq 9.584291413480771 \cdot 10^{+240}\right)
\end{array}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;R \cdot \sqrt{t_0 + {t_1}^{2} \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\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
(let* ((t_0 (* (- phi1 phi2) (- phi1 phi2)))
(t_1 (cos (/ (+ phi1 phi2) 2.0))))
(if (let* ((t_2
(*
R
(sqrt
(+
(* (* (- lambda1 lambda2) t_1) (* (- lambda1 lambda2) t_1))
t_0))))
(t_3 (* (- lambda1 lambda2) t_1)))
(or (<= t_2 (- INFINITY)) (not (<= t_2 9.584291413480771e+240))))
(* R (- phi2 phi1))
(*
R
(sqrt
(+
t_0
(* (pow t_1 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 t_0 = (phi1 - phi2) * (phi1 - phi2);
double t_1 = cos((phi1 + phi2) / 2.0);
double t_2 = R * sqrt((((lambda1 - lambda2) * t_1) * ((lambda1 - lambda2) * t_1)) + t_0);
double t_3 = (lambda1 - lambda2) * t_1;
double tmp;
if ((t_2 <= -((double) INFINITY)) || !(t_2 <= 9.584291413480771e+240)) {
tmp = R * (phi2 - phi1);
} else {
tmp = R * sqrt(t_0 + (pow(t_1, 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 R (sqrt.f64 (+.f64 (*.f64 (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2))) (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2)))) (*.f64 (-.f64 phi1 phi2) (-.f64 phi1 phi2))))) < -inf.0 or 9.58429141348077142e240 < (*.f64 R (sqrt.f64 (+.f64 (*.f64 (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2))) (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2)))) (*.f64 (-.f64 phi1 phi2) (-.f64 phi1 phi2))))) Initial program 62.0
Taylor expanded around -inf 31.6
if -inf.0 < (*.f64 R (sqrt.f64 (+.f64 (*.f64 (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2))) (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2)))) (*.f64 (-.f64 phi1 phi2) (-.f64 phi1 phi2))))) < 9.58429141348077142e240Initial program 1.9
rmApplied add-cbrt-cube_binary642.0
Simplified2.0
rmApplied *-un-lft-identity_binary642.0
Applied sqrt-prod_binary642.0
Simplified2.0
Simplified2.0
Final simplification20.1
herbie shell --seed 2021205
(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))))))