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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\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^{\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r60564 = R;
double r60565 = 2.0;
double r60566 = phi1;
double r60567 = phi2;
double r60568 = r60566 - r60567;
double r60569 = r60568 / r60565;
double r60570 = sin(r60569);
double r60571 = pow(r60570, r60565);
double r60572 = cos(r60566);
double r60573 = cos(r60567);
double r60574 = r60572 * r60573;
double r60575 = lambda1;
double r60576 = lambda2;
double r60577 = r60575 - r60576;
double r60578 = r60577 / r60565;
double r60579 = sin(r60578);
double r60580 = r60574 * r60579;
double r60581 = r60580 * r60579;
double r60582 = r60571 + r60581;
double r60583 = sqrt(r60582);
double r60584 = 1.0;
double r60585 = r60584 - r60582;
double r60586 = sqrt(r60585);
double r60587 = atan2(r60583, r60586);
double r60588 = r60565 * r60587;
double r60589 = r60564 * r60588;
return r60589;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r60590 = R;
double r60591 = 2.0;
double r60592 = phi1;
double r60593 = r60592 / r60591;
double r60594 = sin(r60593);
double r60595 = phi2;
double r60596 = r60595 / r60591;
double r60597 = cos(r60596);
double r60598 = r60594 * r60597;
double r60599 = cos(r60593);
double r60600 = sin(r60596);
double r60601 = r60599 * r60600;
double r60602 = r60598 - r60601;
double r60603 = pow(r60602, r60591);
double r60604 = cos(r60592);
double r60605 = cos(r60595);
double r60606 = r60604 * r60605;
double r60607 = lambda1;
double r60608 = lambda2;
double r60609 = r60607 - r60608;
double r60610 = r60609 / r60591;
double r60611 = sin(r60610);
double r60612 = r60606 * r60611;
double r60613 = r60612 * r60611;
double r60614 = r60603 + r60613;
double r60615 = sqrt(r60614);
double r60616 = 1.0;
double r60617 = 3.0;
double r60618 = pow(r60611, r60617);
double r60619 = cbrt(r60618);
double r60620 = exp(r60619);
double r60621 = log(r60620);
double r60622 = r60612 * r60621;
double r60623 = r60603 + r60622;
double r60624 = r60616 - r60623;
double r60625 = sqrt(r60624);
double r60626 = atan2(r60615, r60625);
double r60627 = r60591 * r60626;
double r60628 = r60590 * r60627;
return r60628;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.3
rmApplied div-sub24.3
Applied sin-diff23.7
rmApplied div-sub23.7
Applied sin-diff14.0
rmApplied add-log-exp14.0
rmApplied add-cbrt-cube14.0
Simplified14.0
Final simplification14.0
herbie shell --seed 2019303 +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))))))))))