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 -9.646905846161997 \cdot 10^{+118}:\\
\;\;\;\;R \cdot \left(\frac{{\cos \left(0.5 \cdot \left(\phi_1 + \phi_2\right)\right)}^{2} \cdot \lambda_2}{\sqrt{{\cos \left(0.5 \cdot \phi_1\right)}^{2}}} - \lambda_1 \cdot \sqrt{{\left(\cos \left(0.5 \cdot \phi_1\right) \cdot \cos \left(0.5 \cdot \phi_2\right) - \sin \left(0.5 \cdot \phi_1\right) \cdot \sin \left(0.5 \cdot \phi_2\right)\right)}^{2}}\right)\\
\mathbf{elif}\;\lambda_1 \leq -6.246904993976676 \cdot 10^{+93}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{elif}\;\lambda_1 \leq -1.7398471697832115 \cdot 10^{+56}:\\
\;\;\;\;R \cdot \sqrt{\left({\phi_2}^{2} + \left({\cos \left(0.5 \cdot \left(\phi_1 + \phi_2\right)\right)}^{2} \cdot {\lambda_1}^{2} + {\phi_1}^{2}\right)\right) - 2 \cdot \left(\phi_1 \cdot \phi_2\right)}\\
\mathbf{elif}\;\lambda_1 \leq -1.1746441344982227 \cdot 10^{-291}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{elif}\;\lambda_1 \leq 4.5327398704856855 \cdot 10^{-290}:\\
\;\;\;\;R \cdot \left(\frac{\lambda_2 \cdot \sqrt[3]{{\cos \left(0.5 \cdot \left(\phi_1 + \phi_2\right)\right)}^{6}}}{\sqrt{{\cos \left(0.5 \cdot \left(\phi_1 + \phi_2\right)\right)}^{2}}} - \lambda_1 \cdot \sqrt{{\left(\cos \left(0.5 \cdot \phi_1\right) \cdot \cos \left(0.5 \cdot \phi_2\right) - \sin \left(0.5 \cdot \phi_1\right) \cdot \sin \left(0.5 \cdot \phi_2\right)\right)}^{2}}\right)\\
\mathbf{elif}\;\lambda_1 \leq 1.2397414903679095 \cdot 10^{-62}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\frac{{\cos \left(0.5 \cdot \left(\phi_1 + \phi_2\right)\right)}^{2} \cdot \lambda_2}{\sqrt{e^{\log \left({\cos \left(0.5 \cdot \left(\phi_1 + \phi_2\right)\right)}^{2}\right)}}} - \lambda_1 \cdot \sqrt{{\left(\cos \left(0.5 \cdot \phi_1\right) \cdot \cos \left(0.5 \cdot \phi_2\right) - \sin \left(0.5 \cdot \phi_1\right) \cdot \sin \left(0.5 \cdot \phi_2\right)\right)}^{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 -9.646905846161997e+118)
(*
R
(-
(/
(* (pow (cos (* 0.5 (+ phi1 phi2))) 2.0) lambda2)
(sqrt (pow (cos (* 0.5 phi1)) 2.0)))
(*
lambda1
(sqrt
(pow
(-
(* (cos (* 0.5 phi1)) (cos (* 0.5 phi2)))
(* (sin (* 0.5 phi1)) (sin (* 0.5 phi2))))
2.0)))))
(if (<= lambda1 -6.246904993976676e+93)
(* R (- phi2 phi1))
(if (<= lambda1 -1.7398471697832115e+56)
(*
R
(sqrt
(-
(+
(pow phi2 2.0)
(+
(* (pow (cos (* 0.5 (+ phi1 phi2))) 2.0) (pow lambda1 2.0))
(pow phi1 2.0)))
(* 2.0 (* phi1 phi2)))))
(if (<= lambda1 -1.1746441344982227e-291)
(* R (- phi2 phi1))
(if (<= lambda1 4.5327398704856855e-290)
(*
R
(-
(/
(* lambda2 (cbrt (pow (cos (* 0.5 (+ phi1 phi2))) 6.0)))
(sqrt (pow (cos (* 0.5 (+ phi1 phi2))) 2.0)))
(*
lambda1
(sqrt
(pow
(-
(* (cos (* 0.5 phi1)) (cos (* 0.5 phi2)))
(* (sin (* 0.5 phi1)) (sin (* 0.5 phi2))))
2.0)))))
(if (<= lambda1 1.2397414903679095e-62)
(* R (- phi2 phi1))
(*
R
(-
(/
(* (pow (cos (* 0.5 (+ phi1 phi2))) 2.0) lambda2)
(sqrt (exp (log (pow (cos (* 0.5 (+ phi1 phi2))) 2.0)))))
(*
lambda1
(sqrt
(pow
(-
(* (cos (* 0.5 phi1)) (cos (* 0.5 phi2)))
(* (sin (* 0.5 phi1)) (sin (* 0.5 phi2))))
2.0))))))))))))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 <= -9.646905846161997e+118) {
tmp = R * (((pow(cos(0.5 * (phi1 + phi2)), 2.0) * lambda2) / sqrt(pow(cos(0.5 * phi1), 2.0))) - (lambda1 * sqrt(pow(((cos(0.5 * phi1) * cos(0.5 * phi2)) - (sin(0.5 * phi1) * sin(0.5 * phi2))), 2.0))));
} else if (lambda1 <= -6.246904993976676e+93) {
tmp = R * (phi2 - phi1);
} else if (lambda1 <= -1.7398471697832115e+56) {
tmp = R * sqrt((pow(phi2, 2.0) + ((pow(cos(0.5 * (phi1 + phi2)), 2.0) * pow(lambda1, 2.0)) + pow(phi1, 2.0))) - (2.0 * (phi1 * phi2)));
} else if (lambda1 <= -1.1746441344982227e-291) {
tmp = R * (phi2 - phi1);
} else if (lambda1 <= 4.5327398704856855e-290) {
tmp = R * (((lambda2 * cbrt(pow(cos(0.5 * (phi1 + phi2)), 6.0))) / sqrt(pow(cos(0.5 * (phi1 + phi2)), 2.0))) - (lambda1 * sqrt(pow(((cos(0.5 * phi1) * cos(0.5 * phi2)) - (sin(0.5 * phi1) * sin(0.5 * phi2))), 2.0))));
} else if (lambda1 <= 1.2397414903679095e-62) {
tmp = R * (phi2 - phi1);
} else {
tmp = R * (((pow(cos(0.5 * (phi1 + phi2)), 2.0) * lambda2) / sqrt(exp(log(pow(cos(0.5 * (phi1 + phi2)), 2.0))))) - (lambda1 * sqrt(pow(((cos(0.5 * phi1) * cos(0.5 * phi2)) - (sin(0.5 * phi1) * sin(0.5 * phi2))), 2.0))));
}
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 < -9.64690584616199693e118Initial program 58.0
rmApplied add-cube-cbrt_binary6458.1
Applied associate-*l*_binary6458.1
Simplified58.1
Taylor expanded around -inf 23.0
Simplified23.0
rmApplied distribute-rgt-in_binary6423.0
Applied cos-sum_binary6417.1
Simplified17.1
Simplified17.1
Taylor expanded around 0 18.0
if -9.64690584616199693e118 < lambda1 < -6.2469049939766764e93 or -1.7398471697832115e56 < lambda1 < -1.17464413449822267e-291 or 4.5327398704856855e-290 < lambda1 < 1.2397414903679095e-62Initial program 30.6
Taylor expanded around -inf 22.3
if -6.2469049939766764e93 < lambda1 < -1.7398471697832115e56Initial program 28.4
Taylor expanded around 0 31.2
if -1.17464413449822267e-291 < lambda1 < 4.5327398704856855e-290Initial program 34.5
rmApplied add-cube-cbrt_binary6434.6
Applied associate-*l*_binary6434.6
Simplified34.6
Taylor expanded around -inf 39.6
Simplified39.6
rmApplied distribute-rgt-in_binary6439.6
Applied cos-sum_binary6439.6
Simplified39.6
Simplified39.6
rmApplied add-cbrt-cube_binary6439.6
Simplified39.6
if 1.2397414903679095e-62 < lambda1 Initial program 49.1
rmApplied add-cube-cbrt_binary6449.2
Applied associate-*l*_binary6449.2
Simplified49.2
Taylor expanded around -inf 24.3
Simplified24.3
rmApplied distribute-rgt-in_binary6424.3
Applied cos-sum_binary6424.3
Simplified24.3
Simplified24.3
rmApplied add-exp-log_binary6424.3
Final simplification22.3
herbie shell --seed 2021175
(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))))))