\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 r53068 = lambda1;
double r53069 = phi2;
double r53070 = cos(r53069);
double r53071 = lambda2;
double r53072 = r53068 - r53071;
double r53073 = sin(r53072);
double r53074 = r53070 * r53073;
double r53075 = phi1;
double r53076 = cos(r53075);
double r53077 = cos(r53072);
double r53078 = r53070 * r53077;
double r53079 = r53076 + r53078;
double r53080 = atan2(r53074, r53079);
double r53081 = r53068 + r53080;
return r53081;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r53082 = lambda1;
double r53083 = phi2;
double r53084 = cos(r53083);
double r53085 = sin(r53082);
double r53086 = lambda2;
double r53087 = cos(r53086);
double r53088 = r53085 * r53087;
double r53089 = cos(r53082);
double r53090 = sin(r53086);
double r53091 = r53089 * r53090;
double r53092 = r53088 - r53091;
double r53093 = r53084 * r53092;
double r53094 = r53087 * r53084;
double r53095 = phi1;
double r53096 = cos(r53095);
double r53097 = fma(r53089, r53094, r53096);
double r53098 = exp(r53097);
double r53099 = log(r53098);
double r53100 = r53085 * r53090;
double r53101 = r53100 * r53084;
double r53102 = r53099 + r53101;
double r53103 = atan2(r53093, r53102);
double r53104 = r53082 + r53103;
return r53104;
}



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 2019356 +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)))))))