\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)}{\log \left(e^{\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2 \cdot \cos \phi_2, \cos \phi_1\right)}\right) + \left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r50087 = lambda1;
double r50088 = phi2;
double r50089 = cos(r50088);
double r50090 = lambda2;
double r50091 = r50087 - r50090;
double r50092 = sin(r50091);
double r50093 = r50089 * r50092;
double r50094 = phi1;
double r50095 = cos(r50094);
double r50096 = cos(r50091);
double r50097 = r50089 * r50096;
double r50098 = r50095 + r50097;
double r50099 = atan2(r50093, r50098);
double r50100 = r50087 + r50099;
return r50100;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r50101 = lambda1;
double r50102 = phi2;
double r50103 = cos(r50102);
double r50104 = sin(r50101);
double r50105 = lambda2;
double r50106 = cos(r50105);
double r50107 = r50104 * r50106;
double r50108 = cos(r50101);
double r50109 = sin(r50105);
double r50110 = r50108 * r50109;
double r50111 = r50107 - r50110;
double r50112 = r50103 * r50111;
double r50113 = r50106 * r50103;
double r50114 = phi1;
double r50115 = cos(r50114);
double r50116 = fma(r50108, r50113, r50115);
double r50117 = exp(r50116);
double r50118 = log(r50117);
double r50119 = r50104 * r50109;
double r50120 = r50119 * r50103;
double r50121 = r50118 + r50120;
double r50122 = atan2(r50112, r50121);
double r50123 = r50101 + r50122;
return r50123;
}



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-rgt-in0.2
Applied associate-+r+0.2
Simplified0.2
rmApplied add-log-exp0.3
Final simplification0.3
herbie shell --seed 2020046 +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)))))))