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(\mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4740217 = R;
double r4740218 = lambda1;
double r4740219 = lambda2;
double r4740220 = r4740218 - r4740219;
double r4740221 = phi1;
double r4740222 = phi2;
double r4740223 = r4740221 + r4740222;
double r4740224 = 2.0;
double r4740225 = r4740223 / r4740224;
double r4740226 = cos(r4740225);
double r4740227 = r4740220 * r4740226;
double r4740228 = r4740227 * r4740227;
double r4740229 = r4740221 - r4740222;
double r4740230 = r4740229 * r4740229;
double r4740231 = r4740228 + r4740230;
double r4740232 = sqrt(r4740231);
double r4740233 = r4740217 * r4740232;
return r4740233;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4740234 = R;
double r4740235 = phi1;
double r4740236 = phi2;
double r4740237 = r4740235 + r4740236;
double r4740238 = 2.0;
double r4740239 = r4740237 / r4740238;
double r4740240 = cos(r4740239);
double r4740241 = log1p(r4740240);
double r4740242 = expm1(r4740241);
double r4740243 = lambda1;
double r4740244 = lambda2;
double r4740245 = r4740243 - r4740244;
double r4740246 = r4740242 * r4740245;
double r4740247 = r4740235 - r4740236;
double r4740248 = hypot(r4740246, r4740247);
double r4740249 = r4740234 * r4740248;
return r4740249;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 37.2
Simplified3.7
rmApplied *-commutative3.7
rmApplied expm1-log1p-u3.7
Final simplification3.7
herbie shell --seed 2019165 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))