\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)}{\frac{{\left(\cos \phi_1\right)}^{3} + {\left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)\right)}^{3}}{\left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)\right) \cdot \left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) - \cos \phi_1\right) + \cos \phi_1 \cdot \cos \phi_1}}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r51461 = lambda1;
double r51462 = phi2;
double r51463 = cos(r51462);
double r51464 = lambda2;
double r51465 = r51461 - r51464;
double r51466 = sin(r51465);
double r51467 = r51463 * r51466;
double r51468 = phi1;
double r51469 = cos(r51468);
double r51470 = cos(r51465);
double r51471 = r51463 * r51470;
double r51472 = r51469 + r51471;
double r51473 = atan2(r51467, r51472);
double r51474 = r51461 + r51473;
return r51474;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r51475 = lambda1;
double r51476 = phi2;
double r51477 = cos(r51476);
double r51478 = sin(r51475);
double r51479 = lambda2;
double r51480 = cos(r51479);
double r51481 = r51478 * r51480;
double r51482 = cos(r51475);
double r51483 = sin(r51479);
double r51484 = r51482 * r51483;
double r51485 = r51481 - r51484;
double r51486 = r51477 * r51485;
double r51487 = phi1;
double r51488 = cos(r51487);
double r51489 = 3.0;
double r51490 = pow(r51488, r51489);
double r51491 = r51482 * r51480;
double r51492 = -r51479;
double r51493 = sin(r51492);
double r51494 = r51478 * r51493;
double r51495 = r51491 - r51494;
double r51496 = r51477 * r51495;
double r51497 = pow(r51496, r51489);
double r51498 = r51490 + r51497;
double r51499 = r51496 - r51488;
double r51500 = r51496 * r51499;
double r51501 = r51488 * r51488;
double r51502 = r51500 + r51501;
double r51503 = r51498 / r51502;
double r51504 = atan2(r51486, r51503);
double r51505 = r51475 + r51504;
return r51505;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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