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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \left(\log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right) + \log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right)\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r142644 = R;
double r142645 = 2.0;
double r142646 = phi1;
double r142647 = phi2;
double r142648 = r142646 - r142647;
double r142649 = r142648 / r142645;
double r142650 = sin(r142649);
double r142651 = pow(r142650, r142645);
double r142652 = cos(r142646);
double r142653 = cos(r142647);
double r142654 = r142652 * r142653;
double r142655 = lambda1;
double r142656 = lambda2;
double r142657 = r142655 - r142656;
double r142658 = r142657 / r142645;
double r142659 = sin(r142658);
double r142660 = r142654 * r142659;
double r142661 = r142660 * r142659;
double r142662 = r142651 + r142661;
double r142663 = sqrt(r142662);
double r142664 = 1.0;
double r142665 = r142664 - r142662;
double r142666 = sqrt(r142665);
double r142667 = atan2(r142663, r142666);
double r142668 = r142645 * r142667;
double r142669 = r142644 * r142668;
return r142669;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r142670 = R;
double r142671 = 2.0;
double r142672 = phi1;
double r142673 = phi2;
double r142674 = r142672 - r142673;
double r142675 = r142674 / r142671;
double r142676 = sin(r142675);
double r142677 = pow(r142676, r142671);
double r142678 = cos(r142672);
double r142679 = cos(r142673);
double r142680 = r142678 * r142679;
double r142681 = lambda1;
double r142682 = lambda2;
double r142683 = r142681 - r142682;
double r142684 = r142683 / r142671;
double r142685 = sin(r142684);
double r142686 = r142680 * r142685;
double r142687 = r142686 * r142685;
double r142688 = r142677 + r142687;
double r142689 = sqrt(r142688);
double r142690 = 1.0;
double r142691 = exp(r142685);
double r142692 = sqrt(r142691);
double r142693 = log(r142692);
double r142694 = r142693 + r142693;
double r142695 = r142686 * r142694;
double r142696 = r142677 + r142695;
double r142697 = r142690 - r142696;
double r142698 = sqrt(r142697);
double r142699 = atan2(r142689, r142698);
double r142700 = r142671 * r142699;
double r142701 = r142670 * r142700;
return r142701;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.3
rmApplied add-log-exp24.3
rmApplied add-sqr-sqrt24.3
Applied log-prod24.3
Final simplification24.3
herbie shell --seed 2020045
(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))))))))))