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 r82717 = R;
double r82718 = 2.0;
double r82719 = phi1;
double r82720 = phi2;
double r82721 = r82719 - r82720;
double r82722 = r82721 / r82718;
double r82723 = sin(r82722);
double r82724 = pow(r82723, r82718);
double r82725 = cos(r82719);
double r82726 = cos(r82720);
double r82727 = r82725 * r82726;
double r82728 = lambda1;
double r82729 = lambda2;
double r82730 = r82728 - r82729;
double r82731 = r82730 / r82718;
double r82732 = sin(r82731);
double r82733 = r82727 * r82732;
double r82734 = r82733 * r82732;
double r82735 = r82724 + r82734;
double r82736 = sqrt(r82735);
double r82737 = 1.0;
double r82738 = r82737 - r82735;
double r82739 = sqrt(r82738);
double r82740 = atan2(r82736, r82739);
double r82741 = r82718 * r82740;
double r82742 = r82717 * r82741;
return r82742;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r82743 = R;
double r82744 = 2.0;
double r82745 = phi1;
double r82746 = r82745 / r82744;
double r82747 = sin(r82746);
double r82748 = phi2;
double r82749 = r82748 / r82744;
double r82750 = cos(r82749);
double r82751 = r82747 * r82750;
double r82752 = cos(r82746);
double r82753 = sin(r82749);
double r82754 = r82752 * r82753;
double r82755 = r82751 - r82754;
double r82756 = pow(r82755, r82744);
double r82757 = cos(r82745);
double r82758 = cos(r82748);
double r82759 = r82757 * r82758;
double r82760 = lambda1;
double r82761 = lambda2;
double r82762 = r82760 - r82761;
double r82763 = r82762 / r82744;
double r82764 = sin(r82763);
double r82765 = r82759 * r82764;
double r82766 = r82765 * r82764;
double r82767 = r82756 + r82766;
double r82768 = sqrt(r82767);
double r82769 = 1.0;
double r82770 = 3.0;
double r82771 = pow(r82764, r82770);
double r82772 = cbrt(r82771);
double r82773 = exp(r82772);
double r82774 = log(r82773);
double r82775 = r82765 * r82774;
double r82776 = r82756 + r82775;
double r82777 = r82769 - r82776;
double r82778 = sqrt(r82777);
double r82779 = atan2(r82768, r82778);
double r82780 = r82744 * r82779;
double r82781 = r82743 * r82780;
return r82781;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.2
rmApplied div-sub24.2
Applied sin-diff23.6
rmApplied div-sub23.6
Applied sin-diff13.9
rmApplied add-log-exp13.9
rmApplied add-cbrt-cube13.9
Simplified13.9
Final simplification13.9
herbie shell --seed 2019294
(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))))))))))