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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \left(\sqrt[3]{{\left(\sqrt[3]{\sin \left(\frac{\lambda_1}{2}\right) \cdot \cos \left(\frac{\lambda_2}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)}\right)}^{6}} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r95401 = R;
double r95402 = 2.0;
double r95403 = phi1;
double r95404 = phi2;
double r95405 = r95403 - r95404;
double r95406 = r95405 / r95402;
double r95407 = sin(r95406);
double r95408 = pow(r95407, r95402);
double r95409 = cos(r95403);
double r95410 = cos(r95404);
double r95411 = r95409 * r95410;
double r95412 = lambda1;
double r95413 = lambda2;
double r95414 = r95412 - r95413;
double r95415 = r95414 / r95402;
double r95416 = sin(r95415);
double r95417 = r95411 * r95416;
double r95418 = r95417 * r95416;
double r95419 = r95408 + r95418;
double r95420 = sqrt(r95419);
double r95421 = 1.0;
double r95422 = r95421 - r95419;
double r95423 = sqrt(r95422);
double r95424 = atan2(r95420, r95423);
double r95425 = r95402 * r95424;
double r95426 = r95401 * r95425;
return r95426;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r95427 = R;
double r95428 = 2.0;
double r95429 = phi1;
double r95430 = phi2;
double r95431 = r95429 - r95430;
double r95432 = r95431 / r95428;
double r95433 = sin(r95432);
double r95434 = pow(r95433, r95428);
double r95435 = cos(r95429);
double r95436 = cos(r95430);
double r95437 = r95435 * r95436;
double r95438 = lambda1;
double r95439 = lambda2;
double r95440 = r95438 - r95439;
double r95441 = r95440 / r95428;
double r95442 = sin(r95441);
double r95443 = r95437 * r95442;
double r95444 = r95443 * r95442;
double r95445 = r95434 + r95444;
double r95446 = sqrt(r95445);
double r95447 = 1.0;
double r95448 = r95438 / r95428;
double r95449 = sin(r95448);
double r95450 = r95439 / r95428;
double r95451 = cos(r95450);
double r95452 = r95449 * r95451;
double r95453 = cos(r95448);
double r95454 = sin(r95450);
double r95455 = r95453 * r95454;
double r95456 = r95452 - r95455;
double r95457 = cbrt(r95456);
double r95458 = 6.0;
double r95459 = pow(r95457, r95458);
double r95460 = cbrt(r95459);
double r95461 = cbrt(r95442);
double r95462 = r95460 * r95461;
double r95463 = r95443 * r95462;
double r95464 = r95434 + r95463;
double r95465 = r95447 - r95464;
double r95466 = sqrt(r95465);
double r95467 = atan2(r95446, r95466);
double r95468 = r95428 * r95467;
double r95469 = r95427 * r95468;
return r95469;
}



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-cube-cbrt24.7
Simplified24.7
rmApplied div-sub24.7
Applied sin-diff24.6
rmApplied unpow-prod-down24.6
Applied cbrt-prod24.6
Simplified24.6
Simplified24.6
Final simplification24.6
herbie shell --seed 2020043
(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))))))))))