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 \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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 \log \left(e^{\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r84801 = R;
double r84802 = 2.0;
double r84803 = phi1;
double r84804 = phi2;
double r84805 = r84803 - r84804;
double r84806 = r84805 / r84802;
double r84807 = sin(r84806);
double r84808 = pow(r84807, r84802);
double r84809 = cos(r84803);
double r84810 = cos(r84804);
double r84811 = r84809 * r84810;
double r84812 = lambda1;
double r84813 = lambda2;
double r84814 = r84812 - r84813;
double r84815 = r84814 / r84802;
double r84816 = sin(r84815);
double r84817 = r84811 * r84816;
double r84818 = r84817 * r84816;
double r84819 = r84808 + r84818;
double r84820 = sqrt(r84819);
double r84821 = 1.0;
double r84822 = r84821 - r84819;
double r84823 = sqrt(r84822);
double r84824 = atan2(r84820, r84823);
double r84825 = r84802 * r84824;
double r84826 = r84801 * r84825;
return r84826;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r84827 = R;
double r84828 = 2.0;
double r84829 = phi1;
double r84830 = phi2;
double r84831 = r84829 - r84830;
double r84832 = r84831 / r84828;
double r84833 = sin(r84832);
double r84834 = pow(r84833, r84828);
double r84835 = cos(r84829);
double r84836 = cos(r84830);
double r84837 = r84835 * r84836;
double r84838 = lambda1;
double r84839 = lambda2;
double r84840 = r84838 - r84839;
double r84841 = r84840 / r84828;
double r84842 = sin(r84841);
double r84843 = r84837 * r84842;
double r84844 = expm1(r84842);
double r84845 = log1p(r84844);
double r84846 = r84843 * r84845;
double r84847 = r84834 + r84846;
double r84848 = sqrt(r84847);
double r84849 = 1.0;
double r84850 = log1p(r84842);
double r84851 = expm1(r84850);
double r84852 = exp(r84851);
double r84853 = log(r84852);
double r84854 = r84843 * r84853;
double r84855 = r84834 + r84854;
double r84856 = r84849 - r84855;
double r84857 = sqrt(r84856);
double r84858 = atan2(r84848, r84857);
double r84859 = r84828 * r84858;
double r84860 = r84827 * r84859;
return r84860;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.8
rmApplied add-log-exp24.8
rmApplied log1p-expm1-u24.8
rmApplied expm1-log1p-u24.8
Final simplification24.8
herbie shell --seed 2020060 +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))))))))))