R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sqrt[3]{{\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}^{3}}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r74318 = R;
double r74319 = 2.0;
double r74320 = phi1;
double r74321 = phi2;
double r74322 = r74320 - r74321;
double r74323 = r74322 / r74319;
double r74324 = sin(r74323);
double r74325 = pow(r74324, r74319);
double r74326 = cos(r74320);
double r74327 = cos(r74321);
double r74328 = r74326 * r74327;
double r74329 = lambda1;
double r74330 = lambda2;
double r74331 = r74329 - r74330;
double r74332 = r74331 / r74319;
double r74333 = sin(r74332);
double r74334 = r74328 * r74333;
double r74335 = r74334 * r74333;
double r74336 = r74325 + r74335;
double r74337 = sqrt(r74336);
double r74338 = 1.0;
double r74339 = r74338 - r74336;
double r74340 = sqrt(r74339);
double r74341 = atan2(r74337, r74340);
double r74342 = r74319 * r74341;
double r74343 = r74318 * r74342;
return r74343;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r74344 = R;
double r74345 = 2.0;
double r74346 = phi1;
double r74347 = phi2;
double r74348 = r74346 - r74347;
double r74349 = r74348 / r74345;
double r74350 = sin(r74349);
double r74351 = pow(r74350, r74345);
double r74352 = cos(r74346);
double r74353 = cos(r74347);
double r74354 = r74352 * r74353;
double r74355 = lambda1;
double r74356 = lambda2;
double r74357 = r74355 - r74356;
double r74358 = r74357 / r74345;
double r74359 = sin(r74358);
double r74360 = r74354 * r74359;
double r74361 = r74360 * r74359;
double r74362 = r74351 + r74361;
double r74363 = sqrt(r74362);
double r74364 = 1.0;
double r74365 = exp(r74359);
double r74366 = log(r74365);
double r74367 = 3.0;
double r74368 = pow(r74366, r74367);
double r74369 = cbrt(r74368);
double r74370 = r74354 * r74369;
double r74371 = r74370 * r74359;
double r74372 = r74351 + r74371;
double r74373 = r74364 - r74372;
double r74374 = sqrt(r74373);
double r74375 = atan2(r74363, r74374);
double r74376 = r74345 * r74375;
double r74377 = r74344 * r74376;
return r74377;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
rmApplied add-log-exp24.6
Final simplification24.6
herbie shell --seed 2019326 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
:precision binary64
(* R (* 2 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))) (sqrt (- 1 (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))))))))