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)\left(2 \cdot R\right) \cdot \tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right), \left(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right) \cdot \cos \phi_1\right) \cdot \cos \phi_2, {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \cos \phi_1\right) \cdot \cos \phi_2, {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r107605 = R;
double r107606 = 2.0;
double r107607 = phi1;
double r107608 = phi2;
double r107609 = r107607 - r107608;
double r107610 = r107609 / r107606;
double r107611 = sin(r107610);
double r107612 = pow(r107611, r107606);
double r107613 = cos(r107607);
double r107614 = cos(r107608);
double r107615 = r107613 * r107614;
double r107616 = lambda1;
double r107617 = lambda2;
double r107618 = r107616 - r107617;
double r107619 = r107618 / r107606;
double r107620 = sin(r107619);
double r107621 = r107615 * r107620;
double r107622 = r107621 * r107620;
double r107623 = r107612 + r107622;
double r107624 = sqrt(r107623);
double r107625 = 1.0;
double r107626 = r107625 - r107623;
double r107627 = sqrt(r107626);
double r107628 = atan2(r107624, r107627);
double r107629 = r107606 * r107628;
double r107630 = r107605 * r107629;
return r107630;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r107631 = 2.0;
double r107632 = R;
double r107633 = r107631 * r107632;
double r107634 = lambda1;
double r107635 = lambda2;
double r107636 = r107634 - r107635;
double r107637 = r107636 / r107631;
double r107638 = sin(r107637);
double r107639 = log1p(r107638);
double r107640 = expm1(r107639);
double r107641 = expm1(r107638);
double r107642 = log1p(r107641);
double r107643 = phi1;
double r107644 = cos(r107643);
double r107645 = r107642 * r107644;
double r107646 = phi2;
double r107647 = cos(r107646);
double r107648 = r107645 * r107647;
double r107649 = r107643 - r107646;
double r107650 = r107649 / r107631;
double r107651 = sin(r107650);
double r107652 = pow(r107651, r107631);
double r107653 = fma(r107640, r107648, r107652);
double r107654 = sqrt(r107653);
double r107655 = 1.0;
double r107656 = r107638 * r107644;
double r107657 = r107656 * r107647;
double r107658 = fma(r107638, r107657, r107652);
double r107659 = r107655 - r107658;
double r107660 = sqrt(r107659);
double r107661 = atan2(r107654, r107660);
double r107662 = r107633 * r107661;
return r107662;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.7
Simplified24.7
rmApplied expm1-log1p-u24.7
rmApplied log1p-expm1-u24.7
Final simplification24.7
herbie shell --seed 2019194 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))