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)2 \cdot \left(R \cdot \tan^{-1}_* \frac{\sqrt{\sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1 - \phi_2}{2}\right) + \left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \cos \phi_2\right) \cdot \left(\cos \phi_1 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}{\sqrt{\cos \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 - \phi_2}{2}\right) - \left(\cos \phi_2 \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \cos \phi_1\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3461637 = R;
double r3461638 = 2.0;
double r3461639 = phi1;
double r3461640 = phi2;
double r3461641 = r3461639 - r3461640;
double r3461642 = r3461641 / r3461638;
double r3461643 = sin(r3461642);
double r3461644 = pow(r3461643, r3461638);
double r3461645 = cos(r3461639);
double r3461646 = cos(r3461640);
double r3461647 = r3461645 * r3461646;
double r3461648 = lambda1;
double r3461649 = lambda2;
double r3461650 = r3461648 - r3461649;
double r3461651 = r3461650 / r3461638;
double r3461652 = sin(r3461651);
double r3461653 = r3461647 * r3461652;
double r3461654 = r3461653 * r3461652;
double r3461655 = r3461644 + r3461654;
double r3461656 = sqrt(r3461655);
double r3461657 = 1.0;
double r3461658 = r3461657 - r3461655;
double r3461659 = sqrt(r3461658);
double r3461660 = atan2(r3461656, r3461659);
double r3461661 = r3461638 * r3461660;
double r3461662 = r3461637 * r3461661;
return r3461662;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3461663 = 2.0;
double r3461664 = R;
double r3461665 = phi1;
double r3461666 = phi2;
double r3461667 = r3461665 - r3461666;
double r3461668 = r3461667 / r3461663;
double r3461669 = sin(r3461668);
double r3461670 = r3461669 * r3461669;
double r3461671 = lambda1;
double r3461672 = lambda2;
double r3461673 = r3461671 - r3461672;
double r3461674 = r3461673 / r3461663;
double r3461675 = sin(r3461674);
double r3461676 = cos(r3461666);
double r3461677 = r3461675 * r3461676;
double r3461678 = cos(r3461665);
double r3461679 = r3461678 * r3461675;
double r3461680 = r3461677 * r3461679;
double r3461681 = r3461670 + r3461680;
double r3461682 = sqrt(r3461681);
double r3461683 = cos(r3461668);
double r3461684 = r3461683 * r3461683;
double r3461685 = exp(r3461675);
double r3461686 = log(r3461685);
double r3461687 = r3461676 * r3461686;
double r3461688 = r3461686 * r3461678;
double r3461689 = r3461687 * r3461688;
double r3461690 = r3461684 - r3461689;
double r3461691 = sqrt(r3461690);
double r3461692 = atan2(r3461682, r3461691);
double r3461693 = r3461664 * r3461692;
double r3461694 = r3461663 * r3461693;
return r3461694;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 23.7
Simplified23.7
rmApplied add-log-exp23.7
rmApplied add-log-exp23.7
Final simplification23.7
herbie shell --seed 2019158
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* 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))))))))))