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 \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \left(\log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right) + \log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right)\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r63530 = R;
double r63531 = 2.0;
double r63532 = phi1;
double r63533 = phi2;
double r63534 = r63532 - r63533;
double r63535 = r63534 / r63531;
double r63536 = sin(r63535);
double r63537 = pow(r63536, r63531);
double r63538 = cos(r63532);
double r63539 = cos(r63533);
double r63540 = r63538 * r63539;
double r63541 = lambda1;
double r63542 = lambda2;
double r63543 = r63541 - r63542;
double r63544 = r63543 / r63531;
double r63545 = sin(r63544);
double r63546 = r63540 * r63545;
double r63547 = r63546 * r63545;
double r63548 = r63537 + r63547;
double r63549 = sqrt(r63548);
double r63550 = 1.0;
double r63551 = r63550 - r63548;
double r63552 = sqrt(r63551);
double r63553 = atan2(r63549, r63552);
double r63554 = r63531 * r63553;
double r63555 = r63530 * r63554;
return r63555;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r63556 = R;
double r63557 = 2.0;
double r63558 = phi1;
double r63559 = phi2;
double r63560 = r63558 - r63559;
double r63561 = r63560 / r63557;
double r63562 = sin(r63561);
double r63563 = pow(r63562, r63557);
double r63564 = cos(r63558);
double r63565 = cos(r63559);
double r63566 = r63564 * r63565;
double r63567 = lambda1;
double r63568 = lambda2;
double r63569 = r63567 - r63568;
double r63570 = r63569 / r63557;
double r63571 = sin(r63570);
double r63572 = r63566 * r63571;
double r63573 = r63572 * r63571;
double r63574 = r63563 + r63573;
double r63575 = sqrt(r63574);
double r63576 = 1.0;
double r63577 = exp(r63571);
double r63578 = log(r63577);
double r63579 = r63566 * r63578;
double r63580 = sqrt(r63577);
double r63581 = log(r63580);
double r63582 = r63581 + r63581;
double r63583 = r63579 * r63582;
double r63584 = r63563 + r63583;
double r63585 = r63576 - r63584;
double r63586 = sqrt(r63585);
double r63587 = atan2(r63575, r63586);
double r63588 = r63557 * r63587;
double r63589 = r63556 * r63588;
return r63589;
}



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
rmApplied add-log-exp24.6
Simplified24.6
rmApplied add-sqr-sqrt24.6
Applied log-prod24.6
Final simplification24.6
herbie shell --seed 2020021
(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))))))))))