\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 \left(-\lambda_2\right)\right)}{\log \left({e}^{\left(\mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right), \cos \phi_1\right)\right)}\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r50015 = lambda1;
double r50016 = phi2;
double r50017 = cos(r50016);
double r50018 = lambda2;
double r50019 = r50015 - r50018;
double r50020 = sin(r50019);
double r50021 = r50017 * r50020;
double r50022 = phi1;
double r50023 = cos(r50022);
double r50024 = cos(r50019);
double r50025 = r50017 * r50024;
double r50026 = r50023 + r50025;
double r50027 = atan2(r50021, r50026);
double r50028 = r50015 + r50027;
return r50028;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r50029 = lambda1;
double r50030 = phi2;
double r50031 = cos(r50030);
double r50032 = sin(r50029);
double r50033 = lambda2;
double r50034 = cos(r50033);
double r50035 = r50032 * r50034;
double r50036 = cos(r50029);
double r50037 = -r50033;
double r50038 = sin(r50037);
double r50039 = r50036 * r50038;
double r50040 = r50035 + r50039;
double r50041 = r50031 * r50040;
double r50042 = exp(1.0);
double r50043 = sin(r50033);
double r50044 = r50032 * r50043;
double r50045 = fma(r50036, r50034, r50044);
double r50046 = phi1;
double r50047 = cos(r50046);
double r50048 = fma(r50031, r50045, r50047);
double r50049 = pow(r50042, r50048);
double r50050 = log(r50049);
double r50051 = atan2(r50041, r50050);
double r50052 = r50029 + r50051;
return r50052;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.8
Simplified0.8
rmApplied sub-neg0.8
Applied sin-sum0.7
Simplified0.7
rmApplied cos-diff0.2
rmApplied add-log-exp0.3
Simplified0.3
rmApplied *-un-lft-identity0.3
Applied exp-prod0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2019304 +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)))))))