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 \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 \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \log \left(e^{\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r145286 = R;
double r145287 = 2.0;
double r145288 = phi1;
double r145289 = phi2;
double r145290 = r145288 - r145289;
double r145291 = r145290 / r145287;
double r145292 = sin(r145291);
double r145293 = pow(r145292, r145287);
double r145294 = cos(r145288);
double r145295 = cos(r145289);
double r145296 = r145294 * r145295;
double r145297 = lambda1;
double r145298 = lambda2;
double r145299 = r145297 - r145298;
double r145300 = r145299 / r145287;
double r145301 = sin(r145300);
double r145302 = r145296 * r145301;
double r145303 = r145302 * r145301;
double r145304 = r145293 + r145303;
double r145305 = sqrt(r145304);
double r145306 = 1.0;
double r145307 = r145306 - r145304;
double r145308 = sqrt(r145307);
double r145309 = atan2(r145305, r145308);
double r145310 = r145287 * r145309;
double r145311 = r145286 * r145310;
return r145311;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r145312 = R;
double r145313 = 2.0;
double r145314 = phi1;
double r145315 = phi2;
double r145316 = r145314 - r145315;
double r145317 = r145316 / r145313;
double r145318 = sin(r145317);
double r145319 = pow(r145318, r145313);
double r145320 = cos(r145314);
double r145321 = cos(r145315);
double r145322 = r145320 * r145321;
double r145323 = lambda1;
double r145324 = lambda2;
double r145325 = r145323 - r145324;
double r145326 = r145325 / r145313;
double r145327 = sin(r145326);
double r145328 = r145322 * r145327;
double r145329 = r145328 * r145327;
double r145330 = r145319 + r145329;
double r145331 = sqrt(r145330);
double r145332 = 1.0;
double r145333 = exp(r145327);
double r145334 = log(r145333);
double r145335 = r145322 * r145334;
double r145336 = 3.0;
double r145337 = pow(r145327, r145336);
double r145338 = cbrt(r145337);
double r145339 = exp(r145338);
double r145340 = log(r145339);
double r145341 = r145335 * r145340;
double r145342 = r145319 + r145341;
double r145343 = r145332 - r145342;
double r145344 = sqrt(r145343);
double r145345 = atan2(r145331, r145344);
double r145346 = r145313 * r145345;
double r145347 = r145312 * r145346;
return r145347;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied add-log-exp24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
rmApplied add-log-exp24.6
Final simplification24.6
herbie shell --seed 2020047
(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))))))))))