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 \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right)\right), \phi_1 - \phi_2\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2768184 = R;
double r2768185 = lambda1;
double r2768186 = lambda2;
double r2768187 = r2768185 - r2768186;
double r2768188 = phi1;
double r2768189 = phi2;
double r2768190 = r2768188 + r2768189;
double r2768191 = 2.0;
double r2768192 = r2768190 / r2768191;
double r2768193 = cos(r2768192);
double r2768194 = r2768187 * r2768193;
double r2768195 = r2768194 * r2768194;
double r2768196 = r2768188 - r2768189;
double r2768197 = r2768196 * r2768196;
double r2768198 = r2768195 + r2768197;
double r2768199 = sqrt(r2768198);
double r2768200 = r2768184 * r2768199;
return r2768200;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2768201 = R;
double r2768202 = lambda1;
double r2768203 = lambda2;
double r2768204 = r2768202 - r2768203;
double r2768205 = phi2;
double r2768206 = phi1;
double r2768207 = r2768205 + r2768206;
double r2768208 = 2.0;
double r2768209 = r2768207 / r2768208;
double r2768210 = cos(r2768209);
double r2768211 = log1p(r2768210);
double r2768212 = expm1(r2768211);
double r2768213 = r2768204 * r2768212;
double r2768214 = r2768206 - r2768205;
double r2768215 = hypot(r2768213, r2768214);
double r2768216 = r2768201 * r2768215;
return r2768216;
}



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.8
rmApplied expm1-log1p-u3.8
Final simplification3.8
herbie shell --seed 2019141 +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))))))