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 \mathsf{expm1}\left(\mathsf{log1p}\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)\right)\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r55392 = R;
double r55393 = 2.0;
double r55394 = phi1;
double r55395 = phi2;
double r55396 = r55394 - r55395;
double r55397 = r55396 / r55393;
double r55398 = sin(r55397);
double r55399 = pow(r55398, r55393);
double r55400 = cos(r55394);
double r55401 = cos(r55395);
double r55402 = r55400 * r55401;
double r55403 = lambda1;
double r55404 = lambda2;
double r55405 = r55403 - r55404;
double r55406 = r55405 / r55393;
double r55407 = sin(r55406);
double r55408 = r55402 * r55407;
double r55409 = r55408 * r55407;
double r55410 = r55399 + r55409;
double r55411 = sqrt(r55410);
double r55412 = 1.0;
double r55413 = r55412 - r55410;
double r55414 = sqrt(r55413);
double r55415 = atan2(r55411, r55414);
double r55416 = r55393 * r55415;
double r55417 = r55392 * r55416;
return r55417;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r55418 = R;
double r55419 = 2.0;
double r55420 = phi1;
double r55421 = phi2;
double r55422 = r55420 - r55421;
double r55423 = r55422 / r55419;
double r55424 = sin(r55423);
double r55425 = pow(r55424, r55419);
double r55426 = cos(r55420);
double r55427 = cos(r55421);
double r55428 = r55426 * r55427;
double r55429 = lambda1;
double r55430 = lambda2;
double r55431 = r55429 - r55430;
double r55432 = r55431 / r55419;
double r55433 = sin(r55432);
double r55434 = r55428 * r55433;
double r55435 = r55434 * r55433;
double r55436 = r55425 + r55435;
double r55437 = sqrt(r55436);
double r55438 = 1.0;
double r55439 = exp(r55433);
double r55440 = log(r55439);
double r55441 = log1p(r55440);
double r55442 = expm1(r55441);
double r55443 = r55428 * r55442;
double r55444 = 3.0;
double r55445 = pow(r55433, r55444);
double r55446 = cbrt(r55445);
double r55447 = r55443 * r55446;
double r55448 = r55425 + r55447;
double r55449 = r55438 - r55448;
double r55450 = sqrt(r55449);
double r55451 = atan2(r55437, r55450);
double r55452 = r55419 * r55451;
double r55453 = r55418 * r55452;
return r55453;
}



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 expm1-log1p-u24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
rmApplied add-log-exp24.6
Final simplification24.6
herbie shell --seed 2019326 +o rules:numerics
(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))))))))))