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 \mathsf{log1p}\left(\mathsf{log1p}\left(\mathsf{expm1}\left(\mathsf{expm1}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right)\right)\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r57096 = R;
double r57097 = lambda1;
double r57098 = lambda2;
double r57099 = r57097 - r57098;
double r57100 = phi1;
double r57101 = phi2;
double r57102 = r57100 + r57101;
double r57103 = 2.0;
double r57104 = r57102 / r57103;
double r57105 = cos(r57104);
double r57106 = r57099 * r57105;
double r57107 = r57106 * r57106;
double r57108 = r57100 - r57101;
double r57109 = r57108 * r57108;
double r57110 = r57107 + r57109;
double r57111 = sqrt(r57110);
double r57112 = r57096 * r57111;
return r57112;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r57113 = lambda1;
double r57114 = lambda2;
double r57115 = r57113 - r57114;
double r57116 = phi1;
double r57117 = phi2;
double r57118 = r57116 + r57117;
double r57119 = 2.0;
double r57120 = r57118 / r57119;
double r57121 = cos(r57120);
double r57122 = expm1(r57121);
double r57123 = expm1(r57122);
double r57124 = log1p(r57123);
double r57125 = log1p(r57124);
double r57126 = r57115 * r57125;
double r57127 = r57116 - r57117;
double r57128 = hypot(r57126, r57127);
double r57129 = R;
double r57130 = r57128 * r57129;
return r57130;
}



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