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)\left(2 \cdot \tan^{-1}_* \frac{\sqrt{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}}\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r54528 = R;
double r54529 = 2.0;
double r54530 = phi1;
double r54531 = phi2;
double r54532 = r54530 - r54531;
double r54533 = r54532 / r54529;
double r54534 = sin(r54533);
double r54535 = pow(r54534, r54529);
double r54536 = cos(r54530);
double r54537 = cos(r54531);
double r54538 = r54536 * r54537;
double r54539 = lambda1;
double r54540 = lambda2;
double r54541 = r54539 - r54540;
double r54542 = r54541 / r54529;
double r54543 = sin(r54542);
double r54544 = r54538 * r54543;
double r54545 = r54544 * r54543;
double r54546 = r54535 + r54545;
double r54547 = sqrt(r54546);
double r54548 = 1.0;
double r54549 = r54548 - r54546;
double r54550 = sqrt(r54549);
double r54551 = atan2(r54547, r54550);
double r54552 = r54529 * r54551;
double r54553 = r54528 * r54552;
return r54553;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r54554 = 2.0;
double r54555 = lambda1;
double r54556 = lambda2;
double r54557 = r54555 - r54556;
double r54558 = r54557 / r54554;
double r54559 = sin(r54558);
double r54560 = phi2;
double r54561 = cos(r54560);
double r54562 = phi1;
double r54563 = cos(r54562);
double r54564 = r54561 * r54563;
double r54565 = r54564 * r54559;
double r54566 = r54559 * r54565;
double r54567 = r54562 - r54560;
double r54568 = r54567 / r54554;
double r54569 = sin(r54568);
double r54570 = pow(r54569, r54554);
double r54571 = r54566 + r54570;
double r54572 = sqrt(r54571);
double r54573 = 1.0;
double r54574 = 3.0;
double r54575 = pow(r54559, r54574);
double r54576 = cbrt(r54575);
double r54577 = r54565 * r54576;
double r54578 = r54570 + r54577;
double r54579 = r54573 - r54578;
double r54580 = sqrt(r54579);
double r54581 = atan2(r54572, r54580);
double r54582 = r54554 * r54581;
double r54583 = R;
double r54584 = r54582 * r54583;
return r54584;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
rmApplied add-cbrt-cube24.4
Simplified24.4
Final simplification24.4
herbie shell --seed 2019179 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))