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)\left(\tan^{-1}_* \frac{\sqrt{{\left(\cos \left(\frac{\phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}{\sqrt{1 - \left(\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \left(\cos \phi_2 \cdot \cos \phi_1\right)\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) + {\left(\cos \left(\frac{\phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2}\right)}} \cdot 2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2736668 = R;
double r2736669 = 2.0;
double r2736670 = phi1;
double r2736671 = phi2;
double r2736672 = r2736670 - r2736671;
double r2736673 = r2736672 / r2736669;
double r2736674 = sin(r2736673);
double r2736675 = pow(r2736674, r2736669);
double r2736676 = cos(r2736670);
double r2736677 = cos(r2736671);
double r2736678 = r2736676 * r2736677;
double r2736679 = lambda1;
double r2736680 = lambda2;
double r2736681 = r2736679 - r2736680;
double r2736682 = r2736681 / r2736669;
double r2736683 = sin(r2736682);
double r2736684 = r2736678 * r2736683;
double r2736685 = r2736684 * r2736683;
double r2736686 = r2736675 + r2736685;
double r2736687 = sqrt(r2736686);
double r2736688 = 1.0;
double r2736689 = r2736688 - r2736686;
double r2736690 = sqrt(r2736689);
double r2736691 = atan2(r2736687, r2736690);
double r2736692 = r2736669 * r2736691;
double r2736693 = r2736668 * r2736692;
return r2736693;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2736694 = phi2;
double r2736695 = 2.0;
double r2736696 = r2736694 / r2736695;
double r2736697 = cos(r2736696);
double r2736698 = phi1;
double r2736699 = r2736698 / r2736695;
double r2736700 = sin(r2736699);
double r2736701 = r2736697 * r2736700;
double r2736702 = cos(r2736699);
double r2736703 = sin(r2736696);
double r2736704 = r2736702 * r2736703;
double r2736705 = r2736701 - r2736704;
double r2736706 = pow(r2736705, r2736695);
double r2736707 = lambda1;
double r2736708 = lambda2;
double r2736709 = r2736707 - r2736708;
double r2736710 = r2736709 / r2736695;
double r2736711 = sin(r2736710);
double r2736712 = cos(r2736694);
double r2736713 = cos(r2736698);
double r2736714 = r2736712 * r2736713;
double r2736715 = r2736714 * r2736711;
double r2736716 = r2736711 * r2736715;
double r2736717 = r2736706 + r2736716;
double r2736718 = sqrt(r2736717);
double r2736719 = 1.0;
double r2736720 = exp(r2736711);
double r2736721 = log(r2736720);
double r2736722 = r2736721 * r2736714;
double r2736723 = r2736722 * r2736721;
double r2736724 = r2736723 + r2736706;
double r2736725 = r2736719 - r2736724;
double r2736726 = sqrt(r2736725);
double r2736727 = atan2(r2736718, r2736726);
double r2736728 = r2736727 * r2736695;
double r2736729 = R;
double r2736730 = r2736728 * r2736729;
return r2736730;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 25.0
rmApplied div-sub25.0
Applied sin-diff24.4
rmApplied div-sub24.4
Applied sin-diff14.5
rmApplied add-log-exp14.5
rmApplied add-log-exp14.5
Final simplification14.5
herbie shell --seed 2019169
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))