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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\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 r70474 = R;
double r70475 = 2.0;
double r70476 = phi1;
double r70477 = phi2;
double r70478 = r70476 - r70477;
double r70479 = r70478 / r70475;
double r70480 = sin(r70479);
double r70481 = pow(r70480, r70475);
double r70482 = cos(r70476);
double r70483 = cos(r70477);
double r70484 = r70482 * r70483;
double r70485 = lambda1;
double r70486 = lambda2;
double r70487 = r70485 - r70486;
double r70488 = r70487 / r70475;
double r70489 = sin(r70488);
double r70490 = r70484 * r70489;
double r70491 = r70490 * r70489;
double r70492 = r70481 + r70491;
double r70493 = sqrt(r70492);
double r70494 = 1.0;
double r70495 = r70494 - r70492;
double r70496 = sqrt(r70495);
double r70497 = atan2(r70493, r70496);
double r70498 = r70475 * r70497;
double r70499 = r70474 * r70498;
return r70499;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r70500 = R;
double r70501 = 2.0;
double r70502 = phi1;
double r70503 = phi2;
double r70504 = r70502 - r70503;
double r70505 = r70504 / r70501;
double r70506 = sin(r70505);
double r70507 = pow(r70506, r70501);
double r70508 = cos(r70502);
double r70509 = cos(r70503);
double r70510 = r70508 * r70509;
double r70511 = lambda1;
double r70512 = lambda2;
double r70513 = r70511 - r70512;
double r70514 = r70513 / r70501;
double r70515 = sin(r70514);
double r70516 = r70510 * r70515;
double r70517 = r70516 * r70515;
double r70518 = r70507 + r70517;
double r70519 = sqrt(r70518);
double r70520 = 1.0;
double r70521 = 3.0;
double r70522 = pow(r70515, r70521);
double r70523 = cbrt(r70522);
double r70524 = exp(r70523);
double r70525 = log(r70524);
double r70526 = r70516 * r70525;
double r70527 = r70507 + r70526;
double r70528 = r70520 - r70527;
double r70529 = sqrt(r70528);
double r70530 = atan2(r70519, r70529);
double r70531 = r70501 * r70530;
double r70532 = r70500 * r70531;
return r70532;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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