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(\tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}} \cdot R\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r123637 = R;
double r123638 = 2.0;
double r123639 = phi1;
double r123640 = phi2;
double r123641 = r123639 - r123640;
double r123642 = r123641 / r123638;
double r123643 = sin(r123642);
double r123644 = pow(r123643, r123638);
double r123645 = cos(r123639);
double r123646 = cos(r123640);
double r123647 = r123645 * r123646;
double r123648 = lambda1;
double r123649 = lambda2;
double r123650 = r123648 - r123649;
double r123651 = r123650 / r123638;
double r123652 = sin(r123651);
double r123653 = r123647 * r123652;
double r123654 = r123653 * r123652;
double r123655 = r123644 + r123654;
double r123656 = sqrt(r123655);
double r123657 = 1.0;
double r123658 = r123657 - r123655;
double r123659 = sqrt(r123658);
double r123660 = atan2(r123656, r123659);
double r123661 = r123638 * r123660;
double r123662 = r123637 * r123661;
return r123662;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r123663 = 2.0;
double r123664 = phi1;
double r123665 = cos(r123664);
double r123666 = phi2;
double r123667 = cos(r123666);
double r123668 = r123665 * r123667;
double r123669 = lambda1;
double r123670 = lambda2;
double r123671 = r123669 - r123670;
double r123672 = r123671 / r123663;
double r123673 = sin(r123672);
double r123674 = r123673 * r123673;
double r123675 = r123664 - r123666;
double r123676 = r123675 / r123663;
double r123677 = sin(r123676);
double r123678 = pow(r123677, r123663);
double r123679 = fma(r123668, r123674, r123678);
double r123680 = sqrt(r123679);
double r123681 = 1.0;
double r123682 = r123681 - r123679;
double r123683 = sqrt(r123682);
double r123684 = atan2(r123680, r123683);
double r123685 = R;
double r123686 = r123684 * r123685;
double r123687 = r123663 * r123686;
return r123687;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.3
Simplified24.3
Final simplification24.3
herbie shell --seed 2020045 +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))))))))))