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)}\begin{array}{l}
\mathbf{if}\;\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) \le 1.3281092196153811 \cdot 10^{307}:\\
\;\;\;\;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)}\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r77697 = R;
double r77698 = lambda1;
double r77699 = lambda2;
double r77700 = r77698 - r77699;
double r77701 = phi1;
double r77702 = phi2;
double r77703 = r77701 + r77702;
double r77704 = 2.0;
double r77705 = r77703 / r77704;
double r77706 = cos(r77705);
double r77707 = r77700 * r77706;
double r77708 = r77707 * r77707;
double r77709 = r77701 - r77702;
double r77710 = r77709 * r77709;
double r77711 = r77708 + r77710;
double r77712 = sqrt(r77711);
double r77713 = r77697 * r77712;
return r77713;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r77714 = lambda1;
double r77715 = lambda2;
double r77716 = r77714 - r77715;
double r77717 = phi1;
double r77718 = phi2;
double r77719 = r77717 + r77718;
double r77720 = 2.0;
double r77721 = r77719 / r77720;
double r77722 = cos(r77721);
double r77723 = r77716 * r77722;
double r77724 = r77723 * r77723;
double r77725 = r77717 - r77718;
double r77726 = r77725 * r77725;
double r77727 = r77724 + r77726;
double r77728 = 1.328109219615381e+307;
bool r77729 = r77727 <= r77728;
double r77730 = R;
double r77731 = sqrt(r77727);
double r77732 = r77730 * r77731;
double r77733 = r77718 - r77717;
double r77734 = r77730 * r77733;
double r77735 = r77729 ? r77732 : r77734;
return r77735;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) < 1.328109219615381e+307Initial program 1.7
if 1.328109219615381e+307 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.8
Taylor expanded around 0 47.1
Final simplification29.3
herbie shell --seed 2019195
(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))))))