\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)}\tan^{-1}_* \frac{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right)}{\sqrt[3]{\mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_2 \cdot \sin \lambda_1\right), \cos \phi_1\right) \cdot \left(\mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_2 \cdot \sin \lambda_1\right), \cos \phi_1\right) \cdot \mathsf{fma}\left(\cos \phi_2, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_2 \cdot \sin \lambda_1\right), \cos \phi_1\right)\right)}} + \lambda_1double f(double lambda1, double lambda2, double phi1, double phi2) {
double r767081 = lambda1;
double r767082 = phi2;
double r767083 = cos(r767082);
double r767084 = lambda2;
double r767085 = r767081 - r767084;
double r767086 = sin(r767085);
double r767087 = r767083 * r767086;
double r767088 = phi1;
double r767089 = cos(r767088);
double r767090 = cos(r767085);
double r767091 = r767083 * r767090;
double r767092 = r767089 + r767091;
double r767093 = atan2(r767087, r767092);
double r767094 = r767081 + r767093;
return r767094;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r767095 = phi2;
double r767096 = cos(r767095);
double r767097 = lambda1;
double r767098 = sin(r767097);
double r767099 = lambda2;
double r767100 = cos(r767099);
double r767101 = r767098 * r767100;
double r767102 = cos(r767097);
double r767103 = sin(r767099);
double r767104 = r767102 * r767103;
double r767105 = r767101 - r767104;
double r767106 = r767096 * r767105;
double r767107 = r767103 * r767098;
double r767108 = fma(r767102, r767100, r767107);
double r767109 = phi1;
double r767110 = cos(r767109);
double r767111 = fma(r767096, r767108, r767110);
double r767112 = r767111 * r767111;
double r767113 = r767111 * r767112;
double r767114 = cbrt(r767113);
double r767115 = atan2(r767106, r767114);
double r767116 = r767115 + r767097;
return r767116;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.8
rmApplied cos-diff0.8
rmApplied sin-diff0.2
rmApplied add-cbrt-cube0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2019152 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Midpoint on a great circle"
(+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))