R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r74252 = R;
double r74253 = 2.0;
double r74254 = phi1;
double r74255 = phi2;
double r74256 = r74254 - r74255;
double r74257 = r74256 / r74253;
double r74258 = sin(r74257);
double r74259 = pow(r74258, r74253);
double r74260 = cos(r74254);
double r74261 = cos(r74255);
double r74262 = r74260 * r74261;
double r74263 = lambda1;
double r74264 = lambda2;
double r74265 = r74263 - r74264;
double r74266 = r74265 / r74253;
double r74267 = sin(r74266);
double r74268 = r74262 * r74267;
double r74269 = r74268 * r74267;
double r74270 = r74259 + r74269;
double r74271 = sqrt(r74270);
double r74272 = 1.0;
double r74273 = r74272 - r74270;
double r74274 = sqrt(r74273);
double r74275 = atan2(r74271, r74274);
double r74276 = r74253 * r74275;
double r74277 = r74252 * r74276;
return r74277;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r74278 = R;
double r74279 = 2.0;
double r74280 = phi1;
double r74281 = phi2;
double r74282 = r74280 - r74281;
double r74283 = r74282 / r74279;
double r74284 = sin(r74283);
double r74285 = pow(r74284, r74279);
double r74286 = cos(r74280);
double r74287 = cos(r74281);
double r74288 = r74286 * r74287;
double r74289 = lambda1;
double r74290 = lambda2;
double r74291 = r74289 - r74290;
double r74292 = r74291 / r74279;
double r74293 = sin(r74292);
double r74294 = r74288 * r74293;
double r74295 = 3.0;
double r74296 = pow(r74293, r74295);
double r74297 = cbrt(r74296);
double r74298 = r74294 * r74297;
double r74299 = r74285 + r74298;
double r74300 = sqrt(r74299);
double r74301 = 1.0;
double r74302 = exp(r74293);
double r74303 = log(r74302);
double r74304 = r74294 * r74303;
double r74305 = r74285 + r74304;
double r74306 = r74301 - r74305;
double r74307 = sqrt(r74306);
double r74308 = atan2(r74300, r74307);
double r74309 = r74279 * r74308;
double r74310 = r74278 * r74309;
return r74310;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.8
rmApplied add-log-exp24.8
rmApplied add-cbrt-cube25.2
Simplified25.2
Final simplification25.2
herbie shell --seed 2020002
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
:precision binary64
(* R (* 2 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))) (sqrt (- 1 (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))))))))