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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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 \left(\log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right) + \log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right)\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r93373 = R;
double r93374 = 2.0;
double r93375 = phi1;
double r93376 = phi2;
double r93377 = r93375 - r93376;
double r93378 = r93377 / r93374;
double r93379 = sin(r93378);
double r93380 = pow(r93379, r93374);
double r93381 = cos(r93375);
double r93382 = cos(r93376);
double r93383 = r93381 * r93382;
double r93384 = lambda1;
double r93385 = lambda2;
double r93386 = r93384 - r93385;
double r93387 = r93386 / r93374;
double r93388 = sin(r93387);
double r93389 = r93383 * r93388;
double r93390 = r93389 * r93388;
double r93391 = r93380 + r93390;
double r93392 = sqrt(r93391);
double r93393 = 1.0;
double r93394 = r93393 - r93391;
double r93395 = sqrt(r93394);
double r93396 = atan2(r93392, r93395);
double r93397 = r93374 * r93396;
double r93398 = r93373 * r93397;
return r93398;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r93399 = R;
double r93400 = 2.0;
double r93401 = phi1;
double r93402 = r93401 / r93400;
double r93403 = sin(r93402);
double r93404 = phi2;
double r93405 = r93404 / r93400;
double r93406 = cos(r93405);
double r93407 = r93403 * r93406;
double r93408 = cos(r93402);
double r93409 = sin(r93405);
double r93410 = r93408 * r93409;
double r93411 = r93407 - r93410;
double r93412 = pow(r93411, r93400);
double r93413 = cos(r93401);
double r93414 = cos(r93404);
double r93415 = r93413 * r93414;
double r93416 = lambda1;
double r93417 = lambda2;
double r93418 = r93416 - r93417;
double r93419 = r93418 / r93400;
double r93420 = sin(r93419);
double r93421 = r93415 * r93420;
double r93422 = r93421 * r93420;
double r93423 = r93412 + r93422;
double r93424 = sqrt(r93423);
double r93425 = 1.0;
double r93426 = exp(r93420);
double r93427 = sqrt(r93426);
double r93428 = log(r93427);
double r93429 = r93428 + r93428;
double r93430 = r93421 * r93429;
double r93431 = r93412 + r93430;
double r93432 = r93425 - r93431;
double r93433 = sqrt(r93432);
double r93434 = atan2(r93424, r93433);
double r93435 = r93400 * r93434;
double r93436 = r93399 * r93435;
return r93436;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.5
rmApplied div-sub24.5
Applied sin-diff23.9
rmApplied div-sub23.9
Applied sin-diff14.2
rmApplied add-log-exp14.2
rmApplied add-sqr-sqrt14.2
Applied log-prod14.2
Final simplification14.2
herbie shell --seed 2019318
(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))))))))))