\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)}\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 + \cos \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)}{\frac{\cos \phi_1 \cdot {\left(\cos \phi_1\right)}^{2} + {\left(\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_2\right)}^{3}}{\left(\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_2\right) \cdot \left(\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_2 - \cos \phi_1\right) + \cos \phi_1 \cdot \cos \phi_1} + \left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r55699 = lambda1;
double r55700 = phi2;
double r55701 = cos(r55700);
double r55702 = lambda2;
double r55703 = r55699 - r55702;
double r55704 = sin(r55703);
double r55705 = r55701 * r55704;
double r55706 = phi1;
double r55707 = cos(r55706);
double r55708 = cos(r55703);
double r55709 = r55701 * r55708;
double r55710 = r55707 + r55709;
double r55711 = atan2(r55705, r55710);
double r55712 = r55699 + r55711;
return r55712;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r55713 = lambda1;
double r55714 = phi2;
double r55715 = cos(r55714);
double r55716 = sin(r55713);
double r55717 = lambda2;
double r55718 = cos(r55717);
double r55719 = r55716 * r55718;
double r55720 = cos(r55713);
double r55721 = -r55717;
double r55722 = sin(r55721);
double r55723 = r55720 * r55722;
double r55724 = r55719 + r55723;
double r55725 = r55715 * r55724;
double r55726 = phi1;
double r55727 = cos(r55726);
double r55728 = 2.0;
double r55729 = pow(r55727, r55728);
double r55730 = r55727 * r55729;
double r55731 = r55720 * r55718;
double r55732 = r55731 * r55715;
double r55733 = 3.0;
double r55734 = pow(r55732, r55733);
double r55735 = r55730 + r55734;
double r55736 = r55732 - r55727;
double r55737 = r55732 * r55736;
double r55738 = r55727 * r55727;
double r55739 = r55737 + r55738;
double r55740 = r55735 / r55739;
double r55741 = sin(r55717);
double r55742 = r55716 * r55741;
double r55743 = r55742 * r55715;
double r55744 = r55740 + r55743;
double r55745 = atan2(r55725, r55744);
double r55746 = r55713 + r55745;
return r55746;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 0.9
rmApplied sub-neg0.9
Applied sin-sum0.8
Simplified0.8
rmApplied cos-diff0.2
Applied distribute-rgt-in0.2
Applied associate-+r+0.2
rmApplied flip3-+0.3
Simplified0.3
rmApplied cube-mult0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020100
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Midpoint on a great circle"
:precision binary64
(+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))