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(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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) \le 6.586678342779032644492237593706605549516 \cdot 10^{306}:\\
\;\;\;\;R \cdot \sqrt{\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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)}\\
\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 r11209232 = R;
double r11209233 = lambda1;
double r11209234 = lambda2;
double r11209235 = r11209233 - r11209234;
double r11209236 = phi1;
double r11209237 = phi2;
double r11209238 = r11209236 + r11209237;
double r11209239 = 2.0;
double r11209240 = r11209238 / r11209239;
double r11209241 = cos(r11209240);
double r11209242 = r11209235 * r11209241;
double r11209243 = r11209242 * r11209242;
double r11209244 = r11209236 - r11209237;
double r11209245 = r11209244 * r11209244;
double r11209246 = r11209243 + r11209245;
double r11209247 = sqrt(r11209246);
double r11209248 = r11209232 * r11209247;
return r11209248;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r11209249 = phi1;
double r11209250 = phi2;
double r11209251 = r11209249 - r11209250;
double r11209252 = r11209251 * r11209251;
double r11209253 = lambda1;
double r11209254 = lambda2;
double r11209255 = r11209253 - r11209254;
double r11209256 = r11209249 + r11209250;
double r11209257 = 2.0;
double r11209258 = r11209256 / r11209257;
double r11209259 = cos(r11209258);
double r11209260 = r11209255 * r11209259;
double r11209261 = r11209260 * r11209260;
double r11209262 = r11209252 + r11209261;
double r11209263 = 6.586678342779033e+306;
bool r11209264 = r11209262 <= r11209263;
double r11209265 = R;
double r11209266 = sqrt(r11209262);
double r11209267 = r11209265 * r11209266;
double r11209268 = r11209250 - r11209249;
double r11209269 = r11209265 * r11209268;
double r11209270 = r11209264 ? r11209267 : r11209269;
return r11209270;
}



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))) < 6.586678342779033e+306Initial program 2.2
if 6.586678342779033e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.8
Taylor expanded around 0 47.1
Final simplification29.2
herbie shell --seed 2019170
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))