\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{\left(\cos \phi_2 \cdot \sin \lambda_1\right) \cdot \cos \lambda_2 + \cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)}{\frac{{\left(\cos \phi_1\right)}^{3} + {\left(\cos \phi_2\right)}^{3} \cdot {\left(\sin \lambda_1 \cdot \sin \lambda_2 + \cos \lambda_1 \cdot \cos \lambda_2\right)}^{3}}{\left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right) \cdot \left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right) - \cos \phi_1\right) + \cos \phi_1 \cdot \cos \phi_1}}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r73528 = lambda1;
double r73529 = phi2;
double r73530 = cos(r73529);
double r73531 = lambda2;
double r73532 = r73528 - r73531;
double r73533 = sin(r73532);
double r73534 = r73530 * r73533;
double r73535 = phi1;
double r73536 = cos(r73535);
double r73537 = cos(r73532);
double r73538 = r73530 * r73537;
double r73539 = r73536 + r73538;
double r73540 = atan2(r73534, r73539);
double r73541 = r73528 + r73540;
return r73541;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r73542 = lambda1;
double r73543 = phi2;
double r73544 = cos(r73543);
double r73545 = sin(r73542);
double r73546 = r73544 * r73545;
double r73547 = lambda2;
double r73548 = cos(r73547);
double r73549 = r73546 * r73548;
double r73550 = cos(r73542);
double r73551 = -r73547;
double r73552 = sin(r73551);
double r73553 = r73550 * r73552;
double r73554 = r73544 * r73553;
double r73555 = r73549 + r73554;
double r73556 = phi1;
double r73557 = cos(r73556);
double r73558 = 3.0;
double r73559 = pow(r73557, r73558);
double r73560 = pow(r73544, r73558);
double r73561 = sin(r73547);
double r73562 = r73545 * r73561;
double r73563 = r73550 * r73548;
double r73564 = r73562 + r73563;
double r73565 = pow(r73564, r73558);
double r73566 = r73560 * r73565;
double r73567 = r73559 + r73566;
double r73568 = r73563 + r73562;
double r73569 = r73544 * r73568;
double r73570 = r73569 - r73557;
double r73571 = r73569 * r73570;
double r73572 = r73557 * r73557;
double r73573 = r73571 + r73572;
double r73574 = r73567 / r73573;
double r73575 = atan2(r73555, r73574);
double r73576 = r73542 + r73575;
return r73576;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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