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{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}}}{\sqrt{1 - \left(\log \left(e^{\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\sin \left(\frac{\lambda_1 - \lambda_2}{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) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4530626 = R;
double r4530627 = 2.0;
double r4530628 = phi1;
double r4530629 = phi2;
double r4530630 = r4530628 - r4530629;
double r4530631 = r4530630 / r4530627;
double r4530632 = sin(r4530631);
double r4530633 = pow(r4530632, r4530627);
double r4530634 = cos(r4530628);
double r4530635 = cos(r4530629);
double r4530636 = r4530634 * r4530635;
double r4530637 = lambda1;
double r4530638 = lambda2;
double r4530639 = r4530637 - r4530638;
double r4530640 = r4530639 / r4530627;
double r4530641 = sin(r4530640);
double r4530642 = r4530636 * r4530641;
double r4530643 = r4530642 * r4530641;
double r4530644 = r4530633 + r4530643;
double r4530645 = sqrt(r4530644);
double r4530646 = 1.0;
double r4530647 = r4530646 - r4530644;
double r4530648 = sqrt(r4530647);
double r4530649 = atan2(r4530645, r4530648);
double r4530650 = r4530627 * r4530649;
double r4530651 = r4530626 * r4530650;
return r4530651;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4530652 = R;
double r4530653 = 2.0;
double r4530654 = lambda1;
double r4530655 = lambda2;
double r4530656 = r4530654 - r4530655;
double r4530657 = r4530656 / r4530653;
double r4530658 = sin(r4530657);
double r4530659 = phi2;
double r4530660 = cos(r4530659);
double r4530661 = phi1;
double r4530662 = cos(r4530661);
double r4530663 = r4530660 * r4530662;
double r4530664 = r4530663 * r4530658;
double r4530665 = r4530658 * r4530664;
double r4530666 = r4530661 - r4530659;
double r4530667 = r4530666 / r4530653;
double r4530668 = sin(r4530667);
double r4530669 = pow(r4530668, r4530653);
double r4530670 = r4530665 + r4530669;
double r4530671 = sqrt(r4530670);
double r4530672 = 1.0;
double r4530673 = r4530658 * r4530658;
double r4530674 = r4530658 * r4530673;
double r4530675 = cbrt(r4530674);
double r4530676 = r4530675 * r4530658;
double r4530677 = r4530658 * r4530676;
double r4530678 = cbrt(r4530677);
double r4530679 = exp(r4530678);
double r4530680 = log(r4530679);
double r4530681 = r4530680 * r4530664;
double r4530682 = r4530681 + r4530669;
double r4530683 = r4530672 - r4530682;
double r4530684 = sqrt(r4530683);
double r4530685 = atan2(r4530671, r4530684);
double r4530686 = r4530653 * r4530685;
double r4530687 = r4530652 * r4530686;
return r4530687;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.5
rmApplied add-log-exp24.5
rmApplied add-cbrt-cube24.5
rmApplied add-cbrt-cube24.5
Final simplification24.5
herbie shell --seed 2019172
(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))))))))))