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]{\sqrt[3]{{\left({\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)}^{3}\right)}^{3}}}, \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r59641 = R;
double r59642 = lambda1;
double r59643 = lambda2;
double r59644 = r59642 - r59643;
double r59645 = phi1;
double r59646 = phi2;
double r59647 = r59645 + r59646;
double r59648 = 2.0;
double r59649 = r59647 / r59648;
double r59650 = cos(r59649);
double r59651 = r59644 * r59650;
double r59652 = r59651 * r59651;
double r59653 = r59645 - r59646;
double r59654 = r59653 * r59653;
double r59655 = r59652 + r59654;
double r59656 = sqrt(r59655);
double r59657 = r59641 * r59656;
return r59657;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r59658 = lambda1;
double r59659 = lambda2;
double r59660 = r59658 - r59659;
double r59661 = phi1;
double r59662 = phi2;
double r59663 = r59661 + r59662;
double r59664 = 2.0;
double r59665 = r59663 / r59664;
double r59666 = cos(r59665);
double r59667 = 3.0;
double r59668 = pow(r59666, r59667);
double r59669 = pow(r59668, r59667);
double r59670 = cbrt(r59669);
double r59671 = cbrt(r59670);
double r59672 = r59660 * r59671;
double r59673 = r59661 - r59662;
double r59674 = hypot(r59672, r59673);
double r59675 = R;
double r59676 = r59674 * r59675;
return r59676;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.1
Simplified3.6
rmApplied add-cbrt-cube3.7
Simplified3.7
rmApplied add-cbrt-cube3.7
Simplified3.7
Final simplification3.7
herbie shell --seed 2019199 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))