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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r78620 = R;
double r78621 = 2.0;
double r78622 = phi1;
double r78623 = phi2;
double r78624 = r78622 - r78623;
double r78625 = r78624 / r78621;
double r78626 = sin(r78625);
double r78627 = pow(r78626, r78621);
double r78628 = cos(r78622);
double r78629 = cos(r78623);
double r78630 = r78628 * r78629;
double r78631 = lambda1;
double r78632 = lambda2;
double r78633 = r78631 - r78632;
double r78634 = r78633 / r78621;
double r78635 = sin(r78634);
double r78636 = r78630 * r78635;
double r78637 = r78636 * r78635;
double r78638 = r78627 + r78637;
double r78639 = sqrt(r78638);
double r78640 = 1.0;
double r78641 = r78640 - r78638;
double r78642 = sqrt(r78641);
double r78643 = atan2(r78639, r78642);
double r78644 = r78621 * r78643;
double r78645 = r78620 * r78644;
return r78645;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r78646 = R;
double r78647 = 2.0;
double r78648 = phi1;
double r78649 = r78648 / r78647;
double r78650 = sin(r78649);
double r78651 = phi2;
double r78652 = r78651 / r78647;
double r78653 = cos(r78652);
double r78654 = r78650 * r78653;
double r78655 = cos(r78649);
double r78656 = sin(r78652);
double r78657 = r78655 * r78656;
double r78658 = r78654 - r78657;
double r78659 = pow(r78658, r78647);
double r78660 = cos(r78648);
double r78661 = cos(r78651);
double r78662 = r78660 * r78661;
double r78663 = lambda1;
double r78664 = lambda2;
double r78665 = r78663 - r78664;
double r78666 = r78665 / r78647;
double r78667 = sin(r78666);
double r78668 = r78662 * r78667;
double r78669 = expm1(r78667);
double r78670 = log1p(r78669);
double r78671 = r78668 * r78670;
double r78672 = r78659 + r78671;
double r78673 = sqrt(r78672);
double r78674 = 1.0;
double r78675 = r78662 * r78670;
double r78676 = r78675 * r78667;
double r78677 = r78659 + r78676;
double r78678 = r78674 - r78677;
double r78679 = sqrt(r78678);
double r78680 = atan2(r78673, r78679);
double r78681 = r78647 * r78680;
double r78682 = r78646 * r78681;
return r78682;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied div-sub24.6
Applied sin-diff24.1
rmApplied div-sub24.1
Applied sin-diff13.9
rmApplied log1p-expm1-u13.9
rmApplied log1p-expm1-u13.9
Final simplification13.9
herbie shell --seed 2020034 +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))))))))))