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(R \cdot 2\right) \cdot \tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}} \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\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}\right)}}{\sqrt{1 - \mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right), {\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}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r75545 = R;
double r75546 = 2.0;
double r75547 = phi1;
double r75548 = phi2;
double r75549 = r75547 - r75548;
double r75550 = r75549 / r75546;
double r75551 = sin(r75550);
double r75552 = pow(r75551, r75546);
double r75553 = cos(r75547);
double r75554 = cos(r75548);
double r75555 = r75553 * r75554;
double r75556 = lambda1;
double r75557 = lambda2;
double r75558 = r75556 - r75557;
double r75559 = r75558 / r75546;
double r75560 = sin(r75559);
double r75561 = r75555 * r75560;
double r75562 = r75561 * r75560;
double r75563 = r75552 + r75562;
double r75564 = sqrt(r75563);
double r75565 = 1.0;
double r75566 = r75565 - r75563;
double r75567 = sqrt(r75566);
double r75568 = atan2(r75564, r75567);
double r75569 = r75546 * r75568;
double r75570 = r75545 * r75569;
return r75570;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r75571 = R;
double r75572 = 2.0;
double r75573 = r75571 * r75572;
double r75574 = phi1;
double r75575 = cos(r75574);
double r75576 = phi2;
double r75577 = cos(r75576);
double r75578 = r75575 * r75577;
double r75579 = lambda1;
double r75580 = lambda2;
double r75581 = r75579 - r75580;
double r75582 = r75581 / r75572;
double r75583 = sin(r75582);
double r75584 = 3.0;
double r75585 = pow(r75583, r75584);
double r75586 = cbrt(r75585);
double r75587 = r75586 * r75583;
double r75588 = r75574 / r75572;
double r75589 = sin(r75588);
double r75590 = r75576 / r75572;
double r75591 = cos(r75590);
double r75592 = r75589 * r75591;
double r75593 = cos(r75588);
double r75594 = sin(r75590);
double r75595 = r75593 * r75594;
double r75596 = r75592 - r75595;
double r75597 = pow(r75596, r75572);
double r75598 = fma(r75578, r75587, r75597);
double r75599 = sqrt(r75598);
double r75600 = 1.0;
double r75601 = expm1(r75583);
double r75602 = log1p(r75601);
double r75603 = r75583 * r75602;
double r75604 = fma(r75578, r75603, r75597);
double r75605 = r75600 - r75604;
double r75606 = sqrt(r75605);
double r75607 = atan2(r75599, r75606);
double r75608 = r75573 * r75607;
return r75608;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.2
Simplified24.2
rmApplied div-sub24.2
Applied sin-diff23.6
rmApplied div-sub23.6
Applied sin-diff13.9
rmApplied log1p-expm1-u13.9
rmApplied add-cbrt-cube14.1
Simplified14.1
Final simplification14.1
herbie shell --seed 2019208 +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))))))))))