\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\right)}^{3} \cdot {\left(\cos \lambda_1 \cdot \cos \lambda_2\right)}^{3}}{\cos \phi_1 \cdot \cos \phi_1 + \left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right) - \cos \phi_1\right) \cdot \left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right)\right)} + \left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r42045 = lambda1;
double r42046 = phi2;
double r42047 = cos(r42046);
double r42048 = lambda2;
double r42049 = r42045 - r42048;
double r42050 = sin(r42049);
double r42051 = r42047 * r42050;
double r42052 = phi1;
double r42053 = cos(r42052);
double r42054 = cos(r42049);
double r42055 = r42047 * r42054;
double r42056 = r42053 + r42055;
double r42057 = atan2(r42051, r42056);
double r42058 = r42045 + r42057;
return r42058;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r42059 = lambda1;
double r42060 = phi2;
double r42061 = cos(r42060);
double r42062 = sin(r42059);
double r42063 = lambda2;
double r42064 = cos(r42063);
double r42065 = r42062 * r42064;
double r42066 = cos(r42059);
double r42067 = sin(r42063);
double r42068 = r42066 * r42067;
double r42069 = r42065 - r42068;
double r42070 = r42061 * r42069;
double r42071 = phi1;
double r42072 = cos(r42071);
double r42073 = 3.0;
double r42074 = pow(r42072, r42073);
double r42075 = pow(r42061, r42073);
double r42076 = r42066 * r42064;
double r42077 = pow(r42076, r42073);
double r42078 = r42075 * r42077;
double r42079 = r42074 + r42078;
double r42080 = r42072 * r42072;
double r42081 = r42061 * r42076;
double r42082 = r42081 - r42072;
double r42083 = r42082 * r42081;
double r42084 = r42080 + r42083;
double r42085 = r42079 / r42084;
double r42086 = r42062 * r42067;
double r42087 = r42086 * r42061;
double r42088 = r42085 + r42087;
double r42089 = atan2(r42070, r42088);
double r42090 = r42059 + r42089;
return r42090;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 0.8
rmApplied cos-diff0.8
Applied distribute-rgt-in0.8
Applied associate-+r+0.8
Simplified0.8
rmApplied sin-diff0.2
rmApplied flip3-+0.3
Simplified0.3
rmApplied unpow-prod-down0.3
Final simplification0.3
herbie shell --seed 2019323
(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)))))))