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)}\begin{array}{l}
\mathbf{if}\;\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) \le 2.35258444110536978 \cdot 10^{299}:\\
\;\;\;\;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)}\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r116162 = R;
double r116163 = lambda1;
double r116164 = lambda2;
double r116165 = r116163 - r116164;
double r116166 = phi1;
double r116167 = phi2;
double r116168 = r116166 + r116167;
double r116169 = 2.0;
double r116170 = r116168 / r116169;
double r116171 = cos(r116170);
double r116172 = r116165 * r116171;
double r116173 = r116172 * r116172;
double r116174 = r116166 - r116167;
double r116175 = r116174 * r116174;
double r116176 = r116173 + r116175;
double r116177 = sqrt(r116176);
double r116178 = r116162 * r116177;
return r116178;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r116179 = lambda1;
double r116180 = lambda2;
double r116181 = r116179 - r116180;
double r116182 = phi1;
double r116183 = phi2;
double r116184 = r116182 + r116183;
double r116185 = 2.0;
double r116186 = r116184 / r116185;
double r116187 = cos(r116186);
double r116188 = r116181 * r116187;
double r116189 = r116188 * r116188;
double r116190 = r116182 - r116183;
double r116191 = r116190 * r116190;
double r116192 = r116189 + r116191;
double r116193 = 2.3525844411053698e+299;
bool r116194 = r116192 <= r116193;
double r116195 = R;
double r116196 = sqrt(r116192);
double r116197 = r116195 * r116196;
double r116198 = r116183 - r116182;
double r116199 = r116195 * r116198;
double r116200 = r116194 ? r116197 : r116199;
return r116200;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) < 2.3525844411053698e+299Initial program 1.9
if 2.3525844411053698e+299 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 62.7
Taylor expanded around 0 47.5
Final simplification29.8
herbie shell --seed 2020057
(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))))))