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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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 \log \left(e^{\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 r72521 = R;
double r72522 = 2.0;
double r72523 = phi1;
double r72524 = phi2;
double r72525 = r72523 - r72524;
double r72526 = r72525 / r72522;
double r72527 = sin(r72526);
double r72528 = pow(r72527, r72522);
double r72529 = cos(r72523);
double r72530 = cos(r72524);
double r72531 = r72529 * r72530;
double r72532 = lambda1;
double r72533 = lambda2;
double r72534 = r72532 - r72533;
double r72535 = r72534 / r72522;
double r72536 = sin(r72535);
double r72537 = r72531 * r72536;
double r72538 = r72537 * r72536;
double r72539 = r72528 + r72538;
double r72540 = sqrt(r72539);
double r72541 = 1.0;
double r72542 = r72541 - r72539;
double r72543 = sqrt(r72542);
double r72544 = atan2(r72540, r72543);
double r72545 = r72522 * r72544;
double r72546 = r72521 * r72545;
return r72546;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r72547 = R;
double r72548 = 2.0;
double r72549 = phi1;
double r72550 = r72549 / r72548;
double r72551 = sin(r72550);
double r72552 = phi2;
double r72553 = r72552 / r72548;
double r72554 = cos(r72553);
double r72555 = r72551 * r72554;
double r72556 = cos(r72550);
double r72557 = sin(r72553);
double r72558 = r72556 * r72557;
double r72559 = r72555 - r72558;
double r72560 = pow(r72559, r72548);
double r72561 = cos(r72549);
double r72562 = cos(r72552);
double r72563 = r72561 * r72562;
double r72564 = lambda1;
double r72565 = lambda2;
double r72566 = r72564 - r72565;
double r72567 = r72566 / r72548;
double r72568 = sin(r72567);
double r72569 = r72563 * r72568;
double r72570 = 3.0;
double r72571 = pow(r72568, r72570);
double r72572 = cbrt(r72571);
double r72573 = r72569 * r72572;
double r72574 = r72560 + r72573;
double r72575 = sqrt(r72574);
double r72576 = 1.0;
double r72577 = exp(r72568);
double r72578 = log(r72577);
double r72579 = r72569 * r72578;
double r72580 = r72560 + r72579;
double r72581 = r72576 - r72580;
double r72582 = sqrt(r72581);
double r72583 = atan2(r72575, r72582);
double r72584 = r72548 * r72583;
double r72585 = r72547 * r72584;
return r72585;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.0
rmApplied div-sub24.0
Applied sin-diff23.4
rmApplied div-sub23.4
Applied sin-diff13.7
rmApplied add-log-exp13.7
rmApplied add-cbrt-cube14.0
Simplified14.0
Final simplification14.0
herbie shell --seed 2019323
(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))))))))))