\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)}{\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_2 \cdot \sin \lambda_1\right) + \cos \phi_1}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r2491362 = lambda1;
double r2491363 = phi2;
double r2491364 = cos(r2491363);
double r2491365 = lambda2;
double r2491366 = r2491362 - r2491365;
double r2491367 = sin(r2491366);
double r2491368 = r2491364 * r2491367;
double r2491369 = phi1;
double r2491370 = cos(r2491369);
double r2491371 = cos(r2491366);
double r2491372 = r2491364 * r2491371;
double r2491373 = r2491370 + r2491372;
double r2491374 = atan2(r2491368, r2491373);
double r2491375 = r2491362 + r2491374;
return r2491375;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r2491376 = lambda1;
double r2491377 = phi2;
double r2491378 = cos(r2491377);
double r2491379 = sin(r2491376);
double r2491380 = lambda2;
double r2491381 = cos(r2491380);
double r2491382 = r2491379 * r2491381;
double r2491383 = cos(r2491376);
double r2491384 = sin(r2491380);
double r2491385 = r2491383 * r2491384;
double r2491386 = r2491382 - r2491385;
double r2491387 = r2491378 * r2491386;
double r2491388 = r2491383 * r2491381;
double r2491389 = r2491384 * r2491379;
double r2491390 = r2491388 + r2491389;
double r2491391 = r2491378 * r2491390;
double r2491392 = phi1;
double r2491393 = cos(r2491392);
double r2491394 = r2491391 + r2491393;
double r2491395 = atan2(r2491387, r2491394);
double r2491396 = r2491376 + r2491395;
return r2491396;
}



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
Final simplification0.2
herbie shell --seed 2019146 +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)))))))