R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}R \cdot \mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r81240 = R;
double r81241 = lambda1;
double r81242 = lambda2;
double r81243 = r81241 - r81242;
double r81244 = phi1;
double r81245 = phi2;
double r81246 = r81244 + r81245;
double r81247 = 2.0;
double r81248 = r81246 / r81247;
double r81249 = cos(r81248);
double r81250 = r81243 * r81249;
double r81251 = r81250 * r81250;
double r81252 = r81244 - r81245;
double r81253 = r81252 * r81252;
double r81254 = r81251 + r81253;
double r81255 = sqrt(r81254);
double r81256 = r81240 * r81255;
return r81256;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r81257 = R;
double r81258 = lambda1;
double r81259 = lambda2;
double r81260 = r81258 - r81259;
double r81261 = phi1;
double r81262 = phi2;
double r81263 = r81261 + r81262;
double r81264 = 2.0;
double r81265 = r81263 / r81264;
double r81266 = cos(r81265);
double r81267 = r81260 * r81266;
double r81268 = r81261 - r81262;
double r81269 = hypot(r81267, r81268);
double r81270 = r81257 * r81269;
return r81270;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.0
Simplified4.1
rmApplied pow14.1
Final simplification4.1
herbie shell --seed 2020089 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
:precision binary64
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))