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 r86115 = R;
double r86116 = lambda1;
double r86117 = lambda2;
double r86118 = r86116 - r86117;
double r86119 = phi1;
double r86120 = phi2;
double r86121 = r86119 + r86120;
double r86122 = 2.0;
double r86123 = r86121 / r86122;
double r86124 = cos(r86123);
double r86125 = r86118 * r86124;
double r86126 = r86125 * r86125;
double r86127 = r86119 - r86120;
double r86128 = r86127 * r86127;
double r86129 = r86126 + r86128;
double r86130 = sqrt(r86129);
double r86131 = r86115 * r86130;
return r86131;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r86132 = lambda1;
double r86133 = lambda2;
double r86134 = r86132 - r86133;
double r86135 = phi1;
double r86136 = phi2;
double r86137 = r86135 + r86136;
double r86138 = 2.0;
double r86139 = r86137 / r86138;
double r86140 = cos(r86139);
double r86141 = r86134 * r86140;
double r86142 = r86135 - r86136;
double r86143 = hypot(r86141, r86142);
double r86144 = R;
double r86145 = r86143 * r86144;
return r86145;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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