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 \sqrt[3]{{\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r94718 = R;
double r94719 = 2.0;
double r94720 = phi1;
double r94721 = phi2;
double r94722 = r94720 - r94721;
double r94723 = r94722 / r94719;
double r94724 = sin(r94723);
double r94725 = pow(r94724, r94719);
double r94726 = cos(r94720);
double r94727 = cos(r94721);
double r94728 = r94726 * r94727;
double r94729 = lambda1;
double r94730 = lambda2;
double r94731 = r94729 - r94730;
double r94732 = r94731 / r94719;
double r94733 = sin(r94732);
double r94734 = r94728 * r94733;
double r94735 = r94734 * r94733;
double r94736 = r94725 + r94735;
double r94737 = sqrt(r94736);
double r94738 = 1.0;
double r94739 = r94738 - r94736;
double r94740 = sqrt(r94739);
double r94741 = atan2(r94737, r94740);
double r94742 = r94719 * r94741;
double r94743 = r94718 * r94742;
return r94743;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r94744 = R;
double r94745 = 2.0;
double r94746 = phi1;
double r94747 = phi2;
double r94748 = r94746 - r94747;
double r94749 = r94748 / r94745;
double r94750 = sin(r94749);
double r94751 = pow(r94750, r94745);
double r94752 = cos(r94746);
double r94753 = cos(r94747);
double r94754 = r94752 * r94753;
double r94755 = lambda1;
double r94756 = lambda2;
double r94757 = r94755 - r94756;
double r94758 = r94757 / r94745;
double r94759 = sin(r94758);
double r94760 = r94754 * r94759;
double r94761 = r94760 * r94759;
double r94762 = r94751 + r94761;
double r94763 = sqrt(r94762);
double r94764 = 1.0;
double r94765 = exp(r94759);
double r94766 = log(r94765);
double r94767 = r94754 * r94766;
double r94768 = 3.0;
double r94769 = pow(r94766, r94768);
double r94770 = cbrt(r94769);
double r94771 = r94767 * r94770;
double r94772 = r94751 + r94771;
double r94773 = r94764 - r94772;
double r94774 = sqrt(r94773);
double r94775 = atan2(r94763, r94774);
double r94776 = r94745 * r94775;
double r94777 = r94744 * r94776;
return r94777;
}



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 2020060
(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))))))))))