\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 \lambda_2\right)}{\frac{{\left(\cos \phi_1\right)}^{3} + {\left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)}^{3}}{\left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right) \cdot \frac{{\left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)}^{2} - {\left(\cos \phi_1\right)}^{2}}{\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right) + \cos \phi_1} + \cos \phi_1 \cdot \cos \phi_1}}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r43651 = lambda1;
double r43652 = phi2;
double r43653 = cos(r43652);
double r43654 = lambda2;
double r43655 = r43651 - r43654;
double r43656 = sin(r43655);
double r43657 = r43653 * r43656;
double r43658 = phi1;
double r43659 = cos(r43658);
double r43660 = cos(r43655);
double r43661 = r43653 * r43660;
double r43662 = r43659 + r43661;
double r43663 = atan2(r43657, r43662);
double r43664 = r43651 + r43663;
return r43664;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r43665 = lambda1;
double r43666 = phi2;
double r43667 = cos(r43666);
double r43668 = sin(r43665);
double r43669 = lambda2;
double r43670 = cos(r43669);
double r43671 = r43668 * r43670;
double r43672 = cos(r43665);
double r43673 = sin(r43669);
double r43674 = r43672 * r43673;
double r43675 = r43671 - r43674;
double r43676 = r43667 * r43675;
double r43677 = phi1;
double r43678 = cos(r43677);
double r43679 = 3.0;
double r43680 = pow(r43678, r43679);
double r43681 = r43672 * r43670;
double r43682 = r43668 * r43673;
double r43683 = r43681 + r43682;
double r43684 = r43667 * r43683;
double r43685 = pow(r43684, r43679);
double r43686 = r43680 + r43685;
double r43687 = 2.0;
double r43688 = pow(r43684, r43687);
double r43689 = pow(r43678, r43687);
double r43690 = r43688 - r43689;
double r43691 = r43684 + r43678;
double r43692 = r43690 / r43691;
double r43693 = r43684 * r43692;
double r43694 = r43678 * r43678;
double r43695 = r43693 + r43694;
double r43696 = r43686 / r43695;
double r43697 = atan2(r43676, r43696);
double r43698 = r43665 + r43697;
return r43698;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 0.9
rmApplied sin-diff0.8
rmApplied cos-diff0.2
rmApplied flip3-+0.3
Simplified0.3
rmApplied flip--0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2019308
(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)))))))