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 -6.7854680350671286 \cdot 10^{+190}:\\
\;\;\;\;R \cdot \left(\lambda_2 \cdot \cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right) - \lambda_1 \cdot \cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)\right)\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -8.528961825021155 \cdot 10^{+163}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -1.868496750933575 \cdot 10^{+149}:\\
\;\;\;\;R \cdot \left(\lambda_2 \cdot \cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right) - \lambda_1 \cdot \cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)\right)\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -3.565954069687537 \cdot 10^{+139}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -2.3353426615490326 \cdot 10^{+106}:\\
\;\;\;\;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 \cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -6.376671243128646 \cdot 10^{+80}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \leq -2.2960510655886167 \cdot 10^{+23}:\\
\;\;\;\;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 \cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\\
\mathbf{else}:\\
\;\;\;\;R \cdot \phi_2 - R \cdot \phi_1\\
\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) -6.7854680350671286e+190)
(*
R
(-
(* lambda2 (cos (* 0.5 (+ phi2 phi1))))
(* lambda1 (cos (* 0.5 (+ phi2 phi1))))))
(if (<= (- lambda1 lambda2) -8.528961825021155e+163)
(* R (- phi2 phi1))
(if (<= (- lambda1 lambda2) -1.868496750933575e+149)
(*
R
(-
(* lambda2 (cos (* 0.5 (+ phi2 phi1))))
(* lambda1 (cos (* 0.5 (+ phi2 phi1))))))
(if (<= (- lambda1 lambda2) -3.565954069687537e+139)
(* R (- phi2 phi1))
(if (<= (- lambda1 lambda2) -2.3353426615490326e+106)
(*
R
(sqrt
(+
(*
(* (- lambda1 lambda2) (cos (/ (+ phi2 phi1) 2.0)))
(* (- lambda1 lambda2) (cos (/ (+ phi2 phi1) 2.0))))
(* (- phi1 phi2) (- phi1 phi2)))))
(if (<= (- lambda1 lambda2) -6.376671243128646e+80)
(* R (- phi2 phi1))
(if (<= (- lambda1 lambda2) -2.2960510655886167e+23)
(*
R
(sqrt
(+
(*
(* (- lambda1 lambda2) (cos (/ (+ phi2 phi1) 2.0)))
(* (- lambda1 lambda2) (cos (/ (+ phi2 phi1) 2.0))))
(* (- phi1 phi2) (- phi1 phi2)))))
(- (* R phi2) (* R phi1))))))))))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) <= -6.7854680350671286e+190) {
tmp = R * ((lambda2 * cos(0.5 * (phi2 + phi1))) - (lambda1 * cos(0.5 * (phi2 + phi1))));
} else if ((lambda1 - lambda2) <= -8.528961825021155e+163) {
tmp = R * (phi2 - phi1);
} else if ((lambda1 - lambda2) <= -1.868496750933575e+149) {
tmp = R * ((lambda2 * cos(0.5 * (phi2 + phi1))) - (lambda1 * cos(0.5 * (phi2 + phi1))));
} else if ((lambda1 - lambda2) <= -3.565954069687537e+139) {
tmp = R * (phi2 - phi1);
} else if ((lambda1 - lambda2) <= -2.3353426615490326e+106) {
tmp = R * sqrt((((lambda1 - lambda2) * cos((phi2 + phi1) / 2.0)) * ((lambda1 - lambda2) * cos((phi2 + phi1) / 2.0))) + ((phi1 - phi2) * (phi1 - phi2)));
} else if ((lambda1 - lambda2) <= -6.376671243128646e+80) {
tmp = R * (phi2 - phi1);
} else if ((lambda1 - lambda2) <= -2.2960510655886167e+23) {
tmp = R * sqrt((((lambda1 - lambda2) * cos((phi2 + phi1) / 2.0)) * ((lambda1 - lambda2) * cos((phi2 + phi1) / 2.0))) + ((phi1 - phi2) * (phi1 - phi2)));
} else {
tmp = (R * phi2) - (R * phi1);
}
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) < -6.78546803506712857e190 or -8.5289618250211547e163 < (-.f64 lambda1 lambda2) < -1.868496750933575e149Initial program 62.7
Taylor expanded around -inf 32.8
if -6.78546803506712857e190 < (-.f64 lambda1 lambda2) < -8.5289618250211547e163 or -1.868496750933575e149 < (-.f64 lambda1 lambda2) < -3.565954069687537e139 or -2.3353426615490326e106 < (-.f64 lambda1 lambda2) < -6.37667124312864593e80Initial program 42.5
Taylor expanded around -inf 36.1
if -3.565954069687537e139 < (-.f64 lambda1 lambda2) < -2.3353426615490326e106 or -6.37667124312864593e80 < (-.f64 lambda1 lambda2) < -2.29605106558861671e23Initial program 24.2
if -2.29605106558861671e23 < (-.f64 lambda1 lambda2) Initial program 22.3
Taylor expanded around -inf 10.9
rmApplied sub-neg_binary64_211710.9
Applied distribute-rgt-in_binary64_207410.9
Simplified10.9
Final simplification24.7
herbie shell --seed 2021093
(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))))))