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 \log \left(e^{\cos \left(\frac{\phi_2 + \phi_1}{2}\right)}\right), \phi_1 - \phi_2\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3579402 = R;
double r3579403 = lambda1;
double r3579404 = lambda2;
double r3579405 = r3579403 - r3579404;
double r3579406 = phi1;
double r3579407 = phi2;
double r3579408 = r3579406 + r3579407;
double r3579409 = 2.0;
double r3579410 = r3579408 / r3579409;
double r3579411 = cos(r3579410);
double r3579412 = r3579405 * r3579411;
double r3579413 = r3579412 * r3579412;
double r3579414 = r3579406 - r3579407;
double r3579415 = r3579414 * r3579414;
double r3579416 = r3579413 + r3579415;
double r3579417 = sqrt(r3579416);
double r3579418 = r3579402 * r3579417;
return r3579418;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3579419 = R;
double r3579420 = lambda1;
double r3579421 = lambda2;
double r3579422 = r3579420 - r3579421;
double r3579423 = phi2;
double r3579424 = phi1;
double r3579425 = r3579423 + r3579424;
double r3579426 = 2.0;
double r3579427 = r3579425 / r3579426;
double r3579428 = cos(r3579427);
double r3579429 = exp(r3579428);
double r3579430 = log(r3579429);
double r3579431 = r3579422 * r3579430;
double r3579432 = r3579424 - r3579423;
double r3579433 = hypot(r3579431, r3579432);
double r3579434 = r3579419 * r3579433;
return r3579434;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.2
Simplified3.9
rmApplied log1p-expm1-u3.9
rmApplied add-cbrt-cube4.0
Simplified4.0
rmApplied add-log-exp4.0
Simplified4.0
Final simplification4.0
herbie shell --seed 2019170 +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.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))