\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 \sqrt[3]{{\left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right) - \cos \phi_1\right)}^{3}} + \cos \phi_1 \cdot \cos \phi_1}}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r56643 = lambda1;
double r56644 = phi2;
double r56645 = cos(r56644);
double r56646 = lambda2;
double r56647 = r56643 - r56646;
double r56648 = sin(r56647);
double r56649 = r56645 * r56648;
double r56650 = phi1;
double r56651 = cos(r56650);
double r56652 = cos(r56647);
double r56653 = r56645 * r56652;
double r56654 = r56651 + r56653;
double r56655 = atan2(r56649, r56654);
double r56656 = r56643 + r56655;
return r56656;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r56657 = lambda1;
double r56658 = phi2;
double r56659 = cos(r56658);
double r56660 = sin(r56657);
double r56661 = lambda2;
double r56662 = cos(r56661);
double r56663 = r56660 * r56662;
double r56664 = cos(r56657);
double r56665 = sin(r56661);
double r56666 = r56664 * r56665;
double r56667 = r56663 - r56666;
double r56668 = r56659 * r56667;
double r56669 = phi1;
double r56670 = cos(r56669);
double r56671 = 3.0;
double r56672 = pow(r56670, r56671);
double r56673 = r56664 * r56662;
double r56674 = r56660 * r56665;
double r56675 = r56673 + r56674;
double r56676 = r56659 * r56675;
double r56677 = pow(r56676, r56671);
double r56678 = r56672 + r56677;
double r56679 = r56676 - r56670;
double r56680 = pow(r56679, r56671);
double r56681 = cbrt(r56680);
double r56682 = r56676 * r56681;
double r56683 = r56670 * r56670;
double r56684 = r56682 + r56683;
double r56685 = r56678 / r56684;
double r56686 = atan2(r56668, r56685);
double r56687 = r56657 + r56686;
return r56687;
}



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.2
Simplified0.2
rmApplied add-cbrt-cube0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020060
(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)))))))