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 \leq -623511300567565.1:\\
\;\;\;\;R \cdot \left(\phi_1 - \phi_2\right)\\
\mathbf{elif}\;\phi_2 \leq -1.1432798135583093 \cdot 10^{-70}:\\
\;\;\;\;R \cdot \sqrt{{\left(\lambda_1 - \lambda_2\right)}^{2} \cdot \left(\cos \left(\frac{\phi_2 + \phi_1}{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}\;\phi_2 \leq -7.263758197549583 \cdot 10^{-158}:\\
\;\;\;\;R \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right)\right)\\
\mathbf{elif}\;\phi_2 \leq -1.4628256157457647 \cdot 10^{-182}:\\
\;\;\;\;R \cdot \left(\phi_1 - \phi_2\right)\\
\mathbf{elif}\;\phi_2 \leq -1.3217438363980596 \cdot 10^{-213}:\\
\;\;\;\;R \cdot \left(-\lambda_1 \cdot \cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right)\right)\\
\mathbf{elif}\;\phi_2 \leq -1.1623653209688043 \cdot 10^{-237}:\\
\;\;\;\;R \cdot \left(\left(0.5 \cdot \left(\frac{\phi_1 \cdot \phi_1}{\lambda_1 \cdot \cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right)} + \frac{\lambda_2 \cdot \left(\phi_2 \cdot \phi_2\right)}{\cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right) \cdot \left(\lambda_1 \cdot \lambda_1\right)}\right) + \left(\lambda_1 \cdot \cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right) + 0.5 \cdot \left(\frac{\lambda_2 \cdot \left(\phi_1 \cdot \phi_1\right)}{\cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right) \cdot \left(\lambda_1 \cdot \lambda_1\right)} + \frac{\phi_2 \cdot \phi_2}{\lambda_1 \cdot \cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right)}\right)\right)\right) - \left(\frac{\phi_2}{\cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right)} \cdot \left(\frac{\phi_1 \cdot \lambda_2}{\lambda_1 \cdot \lambda_1} + \frac{\phi_1}{\lambda_1}\right) + \lambda_2 \cdot \cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right)\right)\right)\\
\mathbf{elif}\;\phi_2 \leq 9.303407807589607 \cdot 10^{-287}:\\
\;\;\;\;R \cdot \sqrt{{\left(\lambda_1 - \lambda_2\right)}^{2} \cdot \left(\cos \left(\frac{\phi_2 + \phi_1}{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}\;\phi_2 \leq 5.38115258344735 \cdot 10^{-250}:\\
\;\;\;\;R \cdot \left(\phi_1 - \phi_2\right)\\
\mathbf{elif}\;\phi_2 \leq 4.962564261877504 \cdot 10^{-88}:\\
\;\;\;\;R \cdot \sqrt{\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + {\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right)}^{2}}\\
\mathbf{elif}\;\phi_2 \leq 9.269945814378616 \cdot 10^{-22}:\\
\;\;\;\;R \cdot \left(\cos \left(\left(\phi_2 + \phi_1\right) \cdot 0.5\right) \cdot \left(\lambda_2 - \lambda_1\right)\right)\\
\mathbf{elif}\;\phi_2 \leq 2.553943994428835 \cdot 10^{+59}:\\
\;\;\;\;R \cdot \sqrt{\left(\phi_2 \cdot \phi_2 + {\cos \left(\phi_2 \cdot 0.5\right)}^{2} \cdot \left(\lambda_1 \cdot \lambda_1 + \lambda_2 \cdot \lambda_2\right)\right) - 2 \cdot \left({\cos \left(\phi_2 \cdot 0.5\right)}^{2} \cdot \left(\lambda_1 \cdot \lambda_2\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\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 (<= phi2 -623511300567565.1)
(* R (- phi1 phi2))
(if (<= phi2 -1.1432798135583093e-70)
(*
R
(sqrt
(+
(*
(pow (- lambda1 lambda2) 2.0)
(* (cos (/ (+ phi2 phi1) 2.0)) (cos (/ (+ phi2 phi1) 2.0))))
(* (- phi1 phi2) (- phi1 phi2)))))
(if (<= phi2 -7.263758197549583e-158)
(* R (* (- lambda1 lambda2) (cos (* (+ phi2 phi1) 0.5))))
(if (<= phi2 -1.4628256157457647e-182)
(* R (- phi1 phi2))
(if (<= phi2 -1.3217438363980596e-213)
(* R (- (* lambda1 (cos (* (+ phi2 phi1) 0.5)))))
(if (<= phi2 -1.1623653209688043e-237)
(*
R
(-
(+
(*
0.5
(+
(/ (* phi1 phi1) (* lambda1 (cos (* (+ phi2 phi1) 0.5))))
(/
(* lambda2 (* phi2 phi2))
(* (cos (* (+ phi2 phi1) 0.5)) (* lambda1 lambda1)))))
(+
(* lambda1 (cos (* (+ phi2 phi1) 0.5)))
(*
0.5
(+
(/
(* lambda2 (* phi1 phi1))
(* (cos (* (+ phi2 phi1) 0.5)) (* lambda1 lambda1)))
(/
(* phi2 phi2)
(* lambda1 (cos (* (+ phi2 phi1) 0.5))))))))
(+
(*
(/ phi2 (cos (* (+ phi2 phi1) 0.5)))
(+ (/ (* phi1 lambda2) (* lambda1 lambda1)) (/ phi1 lambda1)))
(* lambda2 (cos (* (+ phi2 phi1) 0.5))))))
(if (<= phi2 9.303407807589607e-287)
(*
R
(sqrt
(+
(*
(pow (- lambda1 lambda2) 2.0)
(* (cos (/ (+ phi2 phi1) 2.0)) (cos (/ (+ phi2 phi1) 2.0))))
(* (- phi1 phi2) (- phi1 phi2)))))
(if (<= phi2 5.38115258344735e-250)
(* R (- phi1 phi2))
(if (<= phi2 4.962564261877504e-88)
(*
R
(sqrt
(+
(* (- phi1 phi2) (- phi1 phi2))
(pow
(* (- lambda1 lambda2) (cos (/ (+ phi2 phi1) 2.0)))
2.0))))
(if (<= phi2 9.269945814378616e-22)
(* R (* (cos (* (+ phi2 phi1) 0.5)) (- lambda2 lambda1)))
(if (<= phi2 2.553943994428835e+59)
(*
R
(sqrt
(-
(+
(* phi2 phi2)
(*
(pow (cos (* phi2 0.5)) 2.0)
(+ (* lambda1 lambda1) (* lambda2 lambda2))))
(*
2.0
(*
(pow (cos (* phi2 0.5)) 2.0)
(* lambda1 lambda2))))))
(* R (- 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 (phi2 <= -623511300567565.1) {
tmp = R * (phi1 - phi2);
} else if (phi2 <= -1.1432798135583093e-70) {
tmp = R * sqrt((pow((lambda1 - lambda2), 2.0) * (cos((phi2 + phi1) / 2.0) * cos((phi2 + phi1) / 2.0))) + ((phi1 - phi2) * (phi1 - phi2)));
} else if (phi2 <= -7.263758197549583e-158) {
tmp = R * ((lambda1 - lambda2) * cos((phi2 + phi1) * 0.5));
} else if (phi2 <= -1.4628256157457647e-182) {
tmp = R * (phi1 - phi2);
} else if (phi2 <= -1.3217438363980596e-213) {
tmp = R * -(lambda1 * cos((phi2 + phi1) * 0.5));
} else if (phi2 <= -1.1623653209688043e-237) {
tmp = R * (((0.5 * (((phi1 * phi1) / (lambda1 * cos((phi2 + phi1) * 0.5))) + ((lambda2 * (phi2 * phi2)) / (cos((phi2 + phi1) * 0.5) * (lambda1 * lambda1))))) + ((lambda1 * cos((phi2 + phi1) * 0.5)) + (0.5 * (((lambda2 * (phi1 * phi1)) / (cos((phi2 + phi1) * 0.5) * (lambda1 * lambda1))) + ((phi2 * phi2) / (lambda1 * cos((phi2 + phi1) * 0.5))))))) - (((phi2 / cos((phi2 + phi1) * 0.5)) * (((phi1 * lambda2) / (lambda1 * lambda1)) + (phi1 / lambda1))) + (lambda2 * cos((phi2 + phi1) * 0.5))));
} else if (phi2 <= 9.303407807589607e-287) {
tmp = R * sqrt((pow((lambda1 - lambda2), 2.0) * (cos((phi2 + phi1) / 2.0) * cos((phi2 + phi1) / 2.0))) + ((phi1 - phi2) * (phi1 - phi2)));
} else if (phi2 <= 5.38115258344735e-250) {
tmp = R * (phi1 - phi2);
} else if (phi2 <= 4.962564261877504e-88) {
tmp = R * sqrt(((phi1 - phi2) * (phi1 - phi2)) + pow(((lambda1 - lambda2) * cos((phi2 + phi1) / 2.0)), 2.0));
} else if (phi2 <= 9.269945814378616e-22) {
tmp = R * (cos((phi2 + phi1) * 0.5) * (lambda2 - lambda1));
} else if (phi2 <= 2.553943994428835e+59) {
tmp = R * sqrt(((phi2 * phi2) + (pow(cos(phi2 * 0.5), 2.0) * ((lambda1 * lambda1) + (lambda2 * lambda2)))) - (2.0 * (pow(cos(phi2 * 0.5), 2.0) * (lambda1 * lambda2))));
} else {
tmp = R * (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 phi2 < -623511300567565.125 or -7.26375819754958333e-158 < phi2 < -1.46282561574576469e-182 or 9.3034078075896073e-287 < phi2 < 5.3811525834473501e-250Initial program 45.3
Taylor expanded around inf 30.8
if -623511300567565.125 < phi2 < -1.1432798135583093e-70 or -1.16236532096880427e-237 < phi2 < 9.3034078075896073e-287Initial program 31.5
rmApplied swap-sqr_binary64_175031.5
Simplified31.5
if -1.1432798135583093e-70 < phi2 < -7.26375819754958333e-158Initial program 31.3
Taylor expanded around inf 40.0
Simplified40.0
if -1.46282561574576469e-182 < phi2 < -1.3217438363980596e-213Initial program 31.7
Taylor expanded around -inf 50.2
Simplified50.2
if -1.3217438363980596e-213 < phi2 < -1.16236532096880427e-237Initial program 32.2
Taylor expanded around inf 52.7
Simplified53.1
if 5.3811525834473501e-250 < phi2 < 4.9625642618775038e-88Initial program 31.8
rmApplied pow2_binary64_186431.8
if 4.9625642618775038e-88 < phi2 < 9.26994581437861598e-22Initial program 29.3
Taylor expanded around -inf 42.4
Simplified42.4
if 9.26994581437861598e-22 < phi2 < 2.55394399442883498e59Initial program 31.2
Taylor expanded around 0 39.1
Simplified39.1
if 2.55394399442883498e59 < phi2 Initial program 51.3
Taylor expanded around -inf 21.6
Final simplification32.3
herbie shell --seed 2021009
(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))))))