\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 - \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}{\mathsf{fma}\left(\sqrt[3]{\cos \phi_1} \cdot \sqrt[3]{\cos \phi_1}, \sqrt[3]{\cos \phi_1}, \cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r3323286 = lambda1;
double r3323287 = phi2;
double r3323288 = cos(r3323287);
double r3323289 = lambda2;
double r3323290 = r3323286 - r3323289;
double r3323291 = sin(r3323290);
double r3323292 = r3323288 * r3323291;
double r3323293 = phi1;
double r3323294 = cos(r3323293);
double r3323295 = cos(r3323290);
double r3323296 = r3323288 * r3323295;
double r3323297 = r3323294 + r3323296;
double r3323298 = atan2(r3323292, r3323297);
double r3323299 = r3323286 + r3323298;
return r3323299;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r3323300 = lambda1;
double r3323301 = phi2;
double r3323302 = cos(r3323301);
double r3323303 = sin(r3323300);
double r3323304 = lambda2;
double r3323305 = cos(r3323304);
double r3323306 = r3323303 * r3323305;
double r3323307 = cos(r3323300);
double r3323308 = sin(r3323304);
double r3323309 = r3323307 * r3323308;
double r3323310 = log1p(r3323309);
double r3323311 = expm1(r3323310);
double r3323312 = r3323306 - r3323311;
double r3323313 = r3323302 * r3323312;
double r3323314 = phi1;
double r3323315 = cos(r3323314);
double r3323316 = cbrt(r3323315);
double r3323317 = r3323316 * r3323316;
double r3323318 = r3323307 * r3323305;
double r3323319 = r3323303 * r3323308;
double r3323320 = r3323318 + r3323319;
double r3323321 = r3323302 * r3323320;
double r3323322 = fma(r3323317, r3323316, r3323321);
double r3323323 = atan2(r3323313, r3323322);
double r3323324 = r3323300 + r3323323;
return r3323324;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.8
rmApplied sin-diff0.7
rmApplied cos-diff0.2
rmApplied expm1-log1p-u0.2
rmApplied add-cube-cbrt0.4
Applied fma-def0.4
Final simplification0.4
herbie shell --seed 2019173 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Midpoint on a great circle"
(+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))