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)\tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right), \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1 - \phi_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(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right) \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right)}} \cdot \left(R + R\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2773621 = R;
double r2773622 = 2.0;
double r2773623 = phi1;
double r2773624 = phi2;
double r2773625 = r2773623 - r2773624;
double r2773626 = r2773625 / r2773622;
double r2773627 = sin(r2773626);
double r2773628 = pow(r2773627, r2773622);
double r2773629 = cos(r2773623);
double r2773630 = cos(r2773624);
double r2773631 = r2773629 * r2773630;
double r2773632 = lambda1;
double r2773633 = lambda2;
double r2773634 = r2773632 - r2773633;
double r2773635 = r2773634 / r2773622;
double r2773636 = sin(r2773635);
double r2773637 = r2773631 * r2773636;
double r2773638 = r2773637 * r2773636;
double r2773639 = r2773628 + r2773638;
double r2773640 = sqrt(r2773639);
double r2773641 = 1.0;
double r2773642 = r2773641 - r2773639;
double r2773643 = sqrt(r2773642);
double r2773644 = atan2(r2773640, r2773643);
double r2773645 = r2773622 * r2773644;
double r2773646 = r2773621 * r2773645;
return r2773646;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2773647 = lambda1;
double r2773648 = lambda2;
double r2773649 = r2773647 - r2773648;
double r2773650 = 2.0;
double r2773651 = r2773649 / r2773650;
double r2773652 = sin(r2773651);
double r2773653 = phi1;
double r2773654 = cos(r2773653);
double r2773655 = phi2;
double r2773656 = cos(r2773655);
double r2773657 = r2773654 * r2773656;
double r2773658 = r2773652 * r2773657;
double r2773659 = r2773653 - r2773655;
double r2773660 = r2773659 / r2773650;
double r2773661 = sin(r2773660);
double r2773662 = r2773661 * r2773661;
double r2773663 = fma(r2773658, r2773652, r2773662);
double r2773664 = sqrt(r2773663);
double r2773665 = cos(r2773660);
double r2773666 = r2773665 * r2773665;
double r2773667 = r2773648 / r2773650;
double r2773668 = cos(r2773667);
double r2773669 = r2773647 / r2773650;
double r2773670 = sin(r2773669);
double r2773671 = r2773668 * r2773670;
double r2773672 = cos(r2773669);
double r2773673 = sin(r2773667);
double r2773674 = r2773672 * r2773673;
double r2773675 = r2773671 - r2773674;
double r2773676 = r2773657 * r2773675;
double r2773677 = log1p(r2773675);
double r2773678 = expm1(r2773677);
double r2773679 = r2773676 * r2773678;
double r2773680 = r2773666 - r2773679;
double r2773681 = sqrt(r2773680);
double r2773682 = atan2(r2773664, r2773681);
double r2773683 = R;
double r2773684 = r2773683 + r2773683;
double r2773685 = r2773682 * r2773684;
return r2773685;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.4
Simplified24.3
rmApplied expm1-log1p-u24.3
rmApplied div-sub24.3
Applied sin-diff24.5
rmApplied div-sub24.5
Applied sin-diff24.1
Final simplification24.1
herbie shell --seed 2019163 +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))))))))))