\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}\tan^{-1}_* \frac{\left(\cos \left(-\lambda_2\right) \cdot \sin \lambda_1\right) \cdot \cos \phi_2 + \left(\cos \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \cos \phi_2}{\sqrt[3]{\mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right), \cos \phi_1\right) \cdot \left(\mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right), \cos \phi_1\right) \cdot \mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right), \cos \phi_1\right)\right)}} + \lambda_1double f(double lambda1, double lambda2, double phi1, double phi2) {
double r1822654 = lambda1;
double r1822655 = phi2;
double r1822656 = cos(r1822655);
double r1822657 = lambda2;
double r1822658 = r1822654 - r1822657;
double r1822659 = sin(r1822658);
double r1822660 = r1822656 * r1822659;
double r1822661 = phi1;
double r1822662 = cos(r1822661);
double r1822663 = cos(r1822658);
double r1822664 = r1822656 * r1822663;
double r1822665 = r1822662 + r1822664;
double r1822666 = atan2(r1822660, r1822665);
double r1822667 = r1822654 + r1822666;
return r1822667;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r1822668 = lambda2;
double r1822669 = -r1822668;
double r1822670 = cos(r1822669);
double r1822671 = lambda1;
double r1822672 = sin(r1822671);
double r1822673 = r1822670 * r1822672;
double r1822674 = phi2;
double r1822675 = cos(r1822674);
double r1822676 = r1822673 * r1822675;
double r1822677 = cos(r1822671);
double r1822678 = sin(r1822669);
double r1822679 = r1822677 * r1822678;
double r1822680 = r1822679 * r1822675;
double r1822681 = r1822676 + r1822680;
double r1822682 = cos(r1822668);
double r1822683 = sin(r1822668);
double r1822684 = r1822672 * r1822683;
double r1822685 = fma(r1822682, r1822677, r1822684);
double r1822686 = phi1;
double r1822687 = cos(r1822686);
double r1822688 = fma(r1822675, r1822685, r1822687);
double r1822689 = r1822688 * r1822688;
double r1822690 = r1822688 * r1822689;
double r1822691 = cbrt(r1822690);
double r1822692 = atan2(r1822681, r1822691);
double r1822693 = r1822692 + r1822671;
return r1822693;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.8
rmApplied sub-neg0.8
Applied sin-sum0.8
Applied distribute-lft-in0.8
rmApplied sub-neg0.8
Applied cos-sum0.2
rmApplied add-cube-cbrt0.4
Applied fma-def0.4
rmApplied add-cbrt-cube0.4
Simplified0.3
Final simplification0.3
herbie shell --seed 2019200 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Midpoint on a great circle"
(+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))