R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \sqrt[3]{{\left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) - \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)}^{3}}, \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r87620 = R;
double r87621 = lambda1;
double r87622 = lambda2;
double r87623 = r87621 - r87622;
double r87624 = phi1;
double r87625 = phi2;
double r87626 = r87624 + r87625;
double r87627 = 2.0;
double r87628 = r87626 / r87627;
double r87629 = cos(r87628);
double r87630 = r87623 * r87629;
double r87631 = r87630 * r87630;
double r87632 = r87624 - r87625;
double r87633 = r87632 * r87632;
double r87634 = r87631 + r87633;
double r87635 = sqrt(r87634);
double r87636 = r87620 * r87635;
return r87636;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r87637 = lambda1;
double r87638 = lambda2;
double r87639 = r87637 - r87638;
double r87640 = phi2;
double r87641 = 0.5;
double r87642 = r87640 * r87641;
double r87643 = cos(r87642);
double r87644 = phi1;
double r87645 = r87644 * r87641;
double r87646 = cos(r87645);
double r87647 = r87643 * r87646;
double r87648 = sin(r87642);
double r87649 = sin(r87645);
double r87650 = r87648 * r87649;
double r87651 = r87647 - r87650;
double r87652 = 3.0;
double r87653 = pow(r87651, r87652);
double r87654 = cbrt(r87653);
double r87655 = r87639 * r87654;
double r87656 = r87644 - r87640;
double r87657 = hypot(r87655, r87656);
double r87658 = R;
double r87659 = r87657 * r87658;
return r87659;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.2
Simplified3.7
rmApplied pow13.7
Applied pow13.7
Applied pow-prod-down3.7
rmApplied add-cbrt-cube3.7
Simplified3.7
Taylor expanded around inf 3.7
rmApplied distribute-lft-in3.7
Applied cos-sum0.2
Simplified0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2020018 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
:precision binary64
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))