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}\;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)} = -\infty \lor \neg \left(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)} \le 3.044888363833655369523557232630716217491 \cdot 10^{265}\right):\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;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)}\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r382189 = R;
double r382190 = lambda1;
double r382191 = lambda2;
double r382192 = r382190 - r382191;
double r382193 = phi1;
double r382194 = phi2;
double r382195 = r382193 + r382194;
double r382196 = 2.0;
double r382197 = r382195 / r382196;
double r382198 = cos(r382197);
double r382199 = r382192 * r382198;
double r382200 = r382199 * r382199;
double r382201 = r382193 - r382194;
double r382202 = r382201 * r382201;
double r382203 = r382200 + r382202;
double r382204 = sqrt(r382203);
double r382205 = r382189 * r382204;
return r382205;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r382206 = R;
double r382207 = lambda1;
double r382208 = lambda2;
double r382209 = r382207 - r382208;
double r382210 = phi1;
double r382211 = phi2;
double r382212 = r382210 + r382211;
double r382213 = 2.0;
double r382214 = r382212 / r382213;
double r382215 = cos(r382214);
double r382216 = r382209 * r382215;
double r382217 = r382216 * r382216;
double r382218 = r382210 - r382211;
double r382219 = r382218 * r382218;
double r382220 = r382217 + r382219;
double r382221 = sqrt(r382220);
double r382222 = r382206 * r382221;
double r382223 = -inf.0;
bool r382224 = r382222 <= r382223;
double r382225 = 3.0448883638336554e+265;
bool r382226 = r382222 <= r382225;
double r382227 = !r382226;
bool r382228 = r382224 || r382227;
double r382229 = r382211 - r382210;
double r382230 = r382206 * r382229;
double r382231 = r382228 ? r382230 : r382222;
return r382231;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < -inf.0 or 3.0448883638336554e+265 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) Initial program 62.6
Taylor expanded around 0 46.7
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 3.0448883638336554e+265Initial program 1.9
Final simplification29.4
herbie shell --seed 2019298
(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))))))