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 \leq -4.6714712786393294 \cdot 10^{+92}:\\
\;\;\;\;R \cdot \left(\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)} \cdot \lambda_2 - \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 \leq -318.0908199786162:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{elif}\;\lambda_1 \leq -0.00028256165896540234:\\
\;\;\;\;R \cdot \left(\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)} \cdot \lambda_2 - \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 \leq -9.748496887418038 \cdot 10^{-67}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{elif}\;\lambda_1 \leq -2.2368391435846272 \cdot 10^{-98}:\\
\;\;\;\;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 \left(\sqrt[3]{\cos \left(\frac{\phi_2 + \phi_1}{2}\right)} \cdot \left(\sqrt[3]{\cos \left(\frac{\phi_2 + \phi_1}{2}\right)} \cdot \sqrt[3]{\cos \left(0.5 \cdot \phi_1\right)}\right)\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\\
\mathbf{elif}\;\lambda_1 \leq 2.2078159103029802 \cdot 10^{-30}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\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)} \cdot \lambda_2 - \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)\\
\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 -4.6714712786393294e+92)
(*
R
(-
(*
(sqrt
(* (cos (* 0.5 (+ phi2 phi1))) (log (exp (cos (* 0.5 (+ phi2 phi1)))))))
lambda2)
(*
lambda1
(sqrt
(*
(cos (* 0.5 (+ phi2 phi1)))
(log (exp (cos (* 0.5 (+ phi2 phi1))))))))))
(if (<= lambda1 -318.0908199786162)
(* R (- phi2 phi1))
(if (<= lambda1 -0.00028256165896540234)
(*
R
(-
(*
(sqrt
(*
(cos (* 0.5 (+ phi2 phi1)))
(log (exp (cos (* 0.5 (+ phi2 phi1)))))))
lambda2)
(*
lambda1
(sqrt
(*
(cos (* 0.5 (+ phi2 phi1)))
(log (exp (cos (* 0.5 (+ phi2 phi1))))))))))
(if (<= lambda1 -9.748496887418038e-67)
(* R (- phi2 phi1))
(if (<= lambda1 -2.2368391435846272e-98)
(*
R
(sqrt
(+
(*
(* (- lambda1 lambda2) (cos (/ (+ phi2 phi1) 2.0)))
(*
(- lambda1 lambda2)
(*
(cbrt (cos (/ (+ phi2 phi1) 2.0)))
(*
(cbrt (cos (/ (+ phi2 phi1) 2.0)))
(cbrt (cos (* 0.5 phi1)))))))
(* (- phi1 phi2) (- phi1 phi2)))))
(if (<= lambda1 2.2078159103029802e-30)
(* R (- phi2 phi1))
(*
R
(-
(*
(sqrt
(*
(cos (* 0.5 (+ phi2 phi1)))
(log (exp (cos (* 0.5 (+ phi2 phi1)))))))
lambda2)
(*
lambda1
(sqrt
(*
(cos (* 0.5 (+ phi2 phi1)))
(log (exp (cos (* 0.5 (+ phi2 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 <= -4.6714712786393294e+92) {
tmp = R * ((sqrt(cos(0.5 * (phi2 + phi1)) * log(exp(cos(0.5 * (phi2 + phi1))))) * lambda2) - (lambda1 * sqrt(cos(0.5 * (phi2 + phi1)) * log(exp(cos(0.5 * (phi2 + phi1)))))));
} else if (lambda1 <= -318.0908199786162) {
tmp = R * (phi2 - phi1);
} else if (lambda1 <= -0.00028256165896540234) {
tmp = R * ((sqrt(cos(0.5 * (phi2 + phi1)) * log(exp(cos(0.5 * (phi2 + phi1))))) * lambda2) - (lambda1 * sqrt(cos(0.5 * (phi2 + phi1)) * log(exp(cos(0.5 * (phi2 + phi1)))))));
} else if (lambda1 <= -9.748496887418038e-67) {
tmp = R * (phi2 - phi1);
} else if (lambda1 <= -2.2368391435846272e-98) {
tmp = R * sqrt((((lambda1 - lambda2) * cos((phi2 + phi1) / 2.0)) * ((lambda1 - lambda2) * (cbrt(cos((phi2 + phi1) / 2.0)) * (cbrt(cos((phi2 + phi1) / 2.0)) * cbrt(cos(0.5 * phi1)))))) + ((phi1 - phi2) * (phi1 - phi2)));
} else if (lambda1 <= 2.2078159103029802e-30) {
tmp = R * (phi2 - phi1);
} else {
tmp = R * ((sqrt(cos(0.5 * (phi2 + phi1)) * log(exp(cos(0.5 * (phi2 + phi1))))) * lambda2) - (lambda1 * sqrt(cos(0.5 * (phi2 + phi1)) * log(exp(cos(0.5 * (phi2 + 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 lambda1 < -4.67147127863932939e92 or -318.0908199786162 < lambda1 < -2.8256165896540234e-4 or 2.2078159103029802e-30 < lambda1 Initial program 52.9
rmApplied add-log-exp_binary6452.9
Simplified52.9
Taylor expanded around -inf 23.5
if -4.67147127863932939e92 < lambda1 < -318.0908199786162 or -2.8256165896540234e-4 < lambda1 < -9.7484968874180381e-67 or -2.2368391435846272e-98 < lambda1 < 2.2078159103029802e-30Initial program 31.3
Taylor expanded around -inf 22.0
if -9.7484968874180381e-67 < lambda1 < -2.2368391435846272e-98Initial program 25.2
rmApplied add-cube-cbrt_binary6425.2
Simplified25.2
Simplified25.2
Taylor expanded around 0 25.7
Final simplification22.7
herbie shell --seed 2021110
(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))))))