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 \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 r80656 = R;
double r80657 = 2.0;
double r80658 = phi1;
double r80659 = phi2;
double r80660 = r80658 - r80659;
double r80661 = r80660 / r80657;
double r80662 = sin(r80661);
double r80663 = pow(r80662, r80657);
double r80664 = cos(r80658);
double r80665 = cos(r80659);
double r80666 = r80664 * r80665;
double r80667 = lambda1;
double r80668 = lambda2;
double r80669 = r80667 - r80668;
double r80670 = r80669 / r80657;
double r80671 = sin(r80670);
double r80672 = r80666 * r80671;
double r80673 = r80672 * r80671;
double r80674 = r80663 + r80673;
double r80675 = sqrt(r80674);
double r80676 = 1.0;
double r80677 = r80676 - r80674;
double r80678 = sqrt(r80677);
double r80679 = atan2(r80675, r80678);
double r80680 = r80657 * r80679;
double r80681 = r80656 * r80680;
return r80681;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80682 = R;
double r80683 = 2.0;
double r80684 = phi1;
double r80685 = phi2;
double r80686 = r80684 - r80685;
double r80687 = r80686 / r80683;
double r80688 = sin(r80687);
double r80689 = pow(r80688, r80683);
double r80690 = cos(r80684);
double r80691 = cos(r80685);
double r80692 = r80690 * r80691;
double r80693 = lambda1;
double r80694 = lambda2;
double r80695 = r80693 - r80694;
double r80696 = r80695 / r80683;
double r80697 = sin(r80696);
double r80698 = r80692 * r80697;
double r80699 = r80698 * r80697;
double r80700 = r80689 + r80699;
double r80701 = sqrt(r80700);
double r80702 = 1.0;
double r80703 = exp(r80697);
double r80704 = log(r80703);
double r80705 = r80692 * r80704;
double r80706 = 3.0;
double r80707 = pow(r80697, r80706);
double r80708 = cbrt(r80707);
double r80709 = exp(r80708);
double r80710 = log(r80709);
double r80711 = r80705 * r80710;
double r80712 = r80689 + r80711;
double r80713 = r80702 - r80712;
double r80714 = sqrt(r80713);
double r80715 = atan2(r80701, r80714);
double r80716 = r80683 * r80715;
double r80717 = r80682 * r80716;
return r80717;
}



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-log-exp24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
rmApplied add-log-exp24.6
Final simplification24.6
herbie shell --seed 2020047
(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))))))))))