\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{\left(\cos \phi_2 \cdot \sin \lambda_1\right) \cdot \cos \lambda_2 + \cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)}{\frac{{\left(\cos \phi_1\right)}^{3} + {\left(\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_2\right)}^{2} \cdot \left(\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_2\right)}{\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 r42168 = lambda1;
double r42169 = phi2;
double r42170 = cos(r42169);
double r42171 = lambda2;
double r42172 = r42168 - r42171;
double r42173 = sin(r42172);
double r42174 = r42170 * r42173;
double r42175 = phi1;
double r42176 = cos(r42175);
double r42177 = cos(r42172);
double r42178 = r42170 * r42177;
double r42179 = r42176 + r42178;
double r42180 = atan2(r42174, r42179);
double r42181 = r42168 + r42180;
return r42181;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r42182 = lambda1;
double r42183 = phi2;
double r42184 = cos(r42183);
double r42185 = sin(r42182);
double r42186 = r42184 * r42185;
double r42187 = lambda2;
double r42188 = cos(r42187);
double r42189 = r42186 * r42188;
double r42190 = cos(r42182);
double r42191 = -r42187;
double r42192 = sin(r42191);
double r42193 = r42190 * r42192;
double r42194 = r42184 * r42193;
double r42195 = r42189 + r42194;
double r42196 = phi1;
double r42197 = cos(r42196);
double r42198 = 3.0;
double r42199 = pow(r42197, r42198);
double r42200 = r42190 * r42188;
double r42201 = r42200 * r42184;
double r42202 = 2.0;
double r42203 = pow(r42201, r42202);
double r42204 = r42203 * r42201;
double r42205 = r42199 + r42204;
double r42206 = r42201 - r42197;
double r42207 = r42201 * r42206;
double r42208 = r42197 * r42197;
double r42209 = r42207 + r42208;
double r42210 = r42205 / r42209;
double r42211 = sin(r42187);
double r42212 = r42185 * r42211;
double r42213 = r42212 * r42184;
double r42214 = r42210 + r42213;
double r42215 = atan2(r42195, r42214);
double r42216 = r42182 + r42215;
return r42216;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 0.9
rmApplied cos-diff0.9
Applied distribute-rgt-in0.9
Applied associate-+r+0.9
rmApplied sub-neg0.9
Applied sin-sum0.2
Applied distribute-lft-in0.2
Simplified0.2
rmApplied flip3-+0.3
Simplified0.3
rmApplied unpow30.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2019297
(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)))))))