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)}\mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r94184 = R;
double r94185 = lambda1;
double r94186 = lambda2;
double r94187 = r94185 - r94186;
double r94188 = phi1;
double r94189 = phi2;
double r94190 = r94188 + r94189;
double r94191 = 2.0;
double r94192 = r94190 / r94191;
double r94193 = cos(r94192);
double r94194 = r94187 * r94193;
double r94195 = r94194 * r94194;
double r94196 = r94188 - r94189;
double r94197 = r94196 * r94196;
double r94198 = r94195 + r94197;
double r94199 = sqrt(r94198);
double r94200 = r94184 * r94199;
return r94200;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r94201 = lambda1;
double r94202 = lambda2;
double r94203 = r94201 - r94202;
double r94204 = phi1;
double r94205 = phi2;
double r94206 = r94204 + r94205;
double r94207 = 2.0;
double r94208 = r94206 / r94207;
double r94209 = cos(r94208);
double r94210 = r94203 * r94209;
double r94211 = r94204 - r94205;
double r94212 = hypot(r94210, r94211);
double r94213 = R;
double r94214 = r94212 * r94213;
return r94214;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 38.1
Simplified3.4
Final simplification3.4
herbie shell --seed 2020056 +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))))))