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{\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) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}}}{\sqrt{1 - \left(\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) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r1030652 = R;
double r1030653 = 2.0;
double r1030654 = phi1;
double r1030655 = phi2;
double r1030656 = r1030654 - r1030655;
double r1030657 = r1030656 / r1030653;
double r1030658 = sin(r1030657);
double r1030659 = pow(r1030658, r1030653);
double r1030660 = cos(r1030654);
double r1030661 = cos(r1030655);
double r1030662 = r1030660 * r1030661;
double r1030663 = lambda1;
double r1030664 = lambda2;
double r1030665 = r1030663 - r1030664;
double r1030666 = r1030665 / r1030653;
double r1030667 = sin(r1030666);
double r1030668 = r1030662 * r1030667;
double r1030669 = r1030668 * r1030667;
double r1030670 = r1030659 + r1030669;
double r1030671 = sqrt(r1030670);
double r1030672 = 1.0;
double r1030673 = r1030672 - r1030670;
double r1030674 = sqrt(r1030673);
double r1030675 = atan2(r1030671, r1030674);
double r1030676 = r1030653 * r1030675;
double r1030677 = r1030652 * r1030676;
return r1030677;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r1030678 = R;
double r1030679 = 2.0;
double r1030680 = lambda1;
double r1030681 = lambda2;
double r1030682 = r1030680 - r1030681;
double r1030683 = r1030682 / r1030679;
double r1030684 = sin(r1030683);
double r1030685 = phi2;
double r1030686 = cos(r1030685);
double r1030687 = phi1;
double r1030688 = cos(r1030687);
double r1030689 = r1030686 * r1030688;
double r1030690 = r1030689 * r1030684;
double r1030691 = r1030684 * r1030690;
double r1030692 = r1030687 - r1030685;
double r1030693 = r1030692 / r1030679;
double r1030694 = sin(r1030693);
double r1030695 = pow(r1030694, r1030679);
double r1030696 = r1030691 + r1030695;
double r1030697 = sqrt(r1030696);
double r1030698 = 1.0;
double r1030699 = r1030698 - r1030696;
double r1030700 = sqrt(r1030699);
double r1030701 = atan2(r1030697, r1030700);
double r1030702 = r1030679 * r1030701;
double r1030703 = r1030678 * r1030702;
return r1030703;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.2
Final simplification24.2
herbie shell --seed 2019154 +o rules:numerics
(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))))))))))