\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 + \mathsf{log1p}\left(\mathsf{expm1}\left(\tan^{-1}_* \frac{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right)}{\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2 \cdot \cos \phi_2, \cos \phi_1\right) + \cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)}\right)\right)double f(double lambda1, double lambda2, double phi1, double phi2) {
double r54489 = lambda1;
double r54490 = phi2;
double r54491 = cos(r54490);
double r54492 = lambda2;
double r54493 = r54489 - r54492;
double r54494 = sin(r54493);
double r54495 = r54491 * r54494;
double r54496 = phi1;
double r54497 = cos(r54496);
double r54498 = cos(r54493);
double r54499 = r54491 * r54498;
double r54500 = r54497 + r54499;
double r54501 = atan2(r54495, r54500);
double r54502 = r54489 + r54501;
return r54502;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r54503 = lambda1;
double r54504 = phi2;
double r54505 = cos(r54504);
double r54506 = sin(r54503);
double r54507 = lambda2;
double r54508 = cos(r54507);
double r54509 = r54506 * r54508;
double r54510 = cos(r54503);
double r54511 = sin(r54507);
double r54512 = r54510 * r54511;
double r54513 = r54509 - r54512;
double r54514 = r54505 * r54513;
double r54515 = r54508 * r54505;
double r54516 = phi1;
double r54517 = cos(r54516);
double r54518 = fma(r54510, r54515, r54517);
double r54519 = r54506 * r54511;
double r54520 = r54505 * r54519;
double r54521 = r54518 + r54520;
double r54522 = atan2(r54514, r54521);
double r54523 = expm1(r54522);
double r54524 = log1p(r54523);
double r54525 = r54503 + r54524;
return r54525;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.9
rmApplied sin-diff0.9
rmApplied cos-diff0.2
Applied distribute-lft-in0.2
Applied associate-+r+0.2
Simplified0.2
rmApplied log1p-expm1-u0.3
Final simplification0.3
herbie shell --seed 2019353 +o rules:numerics
(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)))))))