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}\;\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) \le 2.5270297792409294 \cdot 10^{307}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \sqrt[3]{\sqrt[3]{{\left({\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)}^{3}\right)}^{3}}}\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)}\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r76251 = R;
double r76252 = lambda1;
double r76253 = lambda2;
double r76254 = r76252 - r76253;
double r76255 = phi1;
double r76256 = phi2;
double r76257 = r76255 + r76256;
double r76258 = 2.0;
double r76259 = r76257 / r76258;
double r76260 = cos(r76259);
double r76261 = r76254 * r76260;
double r76262 = r76261 * r76261;
double r76263 = r76255 - r76256;
double r76264 = r76263 * r76263;
double r76265 = r76262 + r76264;
double r76266 = sqrt(r76265);
double r76267 = r76251 * r76266;
return r76267;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r76268 = lambda1;
double r76269 = lambda2;
double r76270 = r76268 - r76269;
double r76271 = phi1;
double r76272 = phi2;
double r76273 = r76271 + r76272;
double r76274 = 2.0;
double r76275 = r76273 / r76274;
double r76276 = cos(r76275);
double r76277 = r76270 * r76276;
double r76278 = r76277 * r76277;
double r76279 = r76271 - r76272;
double r76280 = r76279 * r76279;
double r76281 = r76278 + r76280;
double r76282 = 2.5270297792409294e+307;
bool r76283 = r76281 <= r76282;
double r76284 = R;
double r76285 = 3.0;
double r76286 = pow(r76276, r76285);
double r76287 = pow(r76286, r76285);
double r76288 = cbrt(r76287);
double r76289 = cbrt(r76288);
double r76290 = r76270 * r76289;
double r76291 = r76290 * r76277;
double r76292 = r76291 + r76280;
double r76293 = sqrt(r76292);
double r76294 = r76284 * r76293;
double r76295 = r76272 - r76271;
double r76296 = r76284 * r76295;
double r76297 = r76283 ? r76294 : r76296;
return r76297;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) < 2.5270297792409294e+307Initial program 1.9
rmApplied add-cbrt-cube1.9
Simplified1.9
rmApplied add-cbrt-cube1.9
Simplified1.9
if 2.5270297792409294e+307 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.9
Taylor expanded around 0 47.4
Final simplification29.2
herbie shell --seed 2020049
(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))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))