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^{\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 r102495 = R;
double r102496 = 2.0;
double r102497 = phi1;
double r102498 = phi2;
double r102499 = r102497 - r102498;
double r102500 = r102499 / r102496;
double r102501 = sin(r102500);
double r102502 = pow(r102501, r102496);
double r102503 = cos(r102497);
double r102504 = cos(r102498);
double r102505 = r102503 * r102504;
double r102506 = lambda1;
double r102507 = lambda2;
double r102508 = r102506 - r102507;
double r102509 = r102508 / r102496;
double r102510 = sin(r102509);
double r102511 = r102505 * r102510;
double r102512 = r102511 * r102510;
double r102513 = r102502 + r102512;
double r102514 = sqrt(r102513);
double r102515 = 1.0;
double r102516 = r102515 - r102513;
double r102517 = sqrt(r102516);
double r102518 = atan2(r102514, r102517);
double r102519 = r102496 * r102518;
double r102520 = r102495 * r102519;
return r102520;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r102521 = R;
double r102522 = 2.0;
double r102523 = phi1;
double r102524 = phi2;
double r102525 = r102523 - r102524;
double r102526 = r102525 / r102522;
double r102527 = sin(r102526);
double r102528 = pow(r102527, r102522);
double r102529 = cos(r102523);
double r102530 = cos(r102524);
double r102531 = r102529 * r102530;
double r102532 = lambda1;
double r102533 = lambda2;
double r102534 = r102532 - r102533;
double r102535 = r102534 / r102522;
double r102536 = sin(r102535);
double r102537 = r102531 * r102536;
double r102538 = r102537 * r102536;
double r102539 = r102528 + r102538;
double r102540 = sqrt(r102539);
double r102541 = 1.0;
double r102542 = exp(r102536);
double r102543 = log(r102542);
double r102544 = r102531 * r102543;
double r102545 = r102544 * r102543;
double r102546 = r102528 + r102545;
double r102547 = r102541 - r102546;
double r102548 = sqrt(r102547);
double r102549 = atan2(r102540, r102548);
double r102550 = r102522 * r102549;
double r102551 = r102521 * r102550;
return r102551;
}



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-log-exp24.6
Final simplification24.6
herbie shell --seed 2020020 +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))))))))))