\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 \sin \left(\lambda_1 - \lambda_2\right)}{\sqrt[3]{{\left(\cos \phi_1 + \cos \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_2\right)}^{3}}}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r48461 = lambda1;
double r48462 = phi2;
double r48463 = cos(r48462);
double r48464 = lambda2;
double r48465 = r48461 - r48464;
double r48466 = sin(r48465);
double r48467 = r48463 * r48466;
double r48468 = phi1;
double r48469 = cos(r48468);
double r48470 = cos(r48465);
double r48471 = r48463 * r48470;
double r48472 = r48469 + r48471;
double r48473 = atan2(r48467, r48472);
double r48474 = r48461 + r48473;
return r48474;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r48475 = lambda1;
double r48476 = phi2;
double r48477 = cos(r48476);
double r48478 = lambda2;
double r48479 = r48475 - r48478;
double r48480 = sin(r48479);
double r48481 = r48477 * r48480;
double r48482 = phi1;
double r48483 = cos(r48482);
double r48484 = cos(r48479);
double r48485 = r48484 * r48477;
double r48486 = r48483 + r48485;
double r48487 = 3.0;
double r48488 = pow(r48486, r48487);
double r48489 = cbrt(r48488);
double r48490 = atan2(r48481, r48489);
double r48491 = r48475 + r48490;
return r48491;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 0.9
rmApplied add-log-exp0.9
rmApplied add-log-exp0.9
Applied add-log-exp0.9
Applied sum-log1.0
Simplified0.9
rmApplied add-cbrt-cube1.0
Simplified0.9
Final simplification0.9
herbie shell --seed 2020035
(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)))))))