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}\;\lambda_1 - \lambda_2 \le -5.485072116683906760810748866048419583343 \cdot 10^{154}:\\
\;\;\;\;R \cdot \frac{\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)}{\frac{-1}{\lambda_1}}\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \le 1.015908151149958197110468381283702293902 \cdot 10^{149}:\\
\;\;\;\;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 \frac{\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)}{\frac{1}{\lambda_1}}\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r55592 = R;
double r55593 = lambda1;
double r55594 = lambda2;
double r55595 = r55593 - r55594;
double r55596 = phi1;
double r55597 = phi2;
double r55598 = r55596 + r55597;
double r55599 = 2.0;
double r55600 = r55598 / r55599;
double r55601 = cos(r55600);
double r55602 = r55595 * r55601;
double r55603 = r55602 * r55602;
double r55604 = r55596 - r55597;
double r55605 = r55604 * r55604;
double r55606 = r55603 + r55605;
double r55607 = sqrt(r55606);
double r55608 = r55592 * r55607;
return r55608;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r55609 = lambda1;
double r55610 = lambda2;
double r55611 = r55609 - r55610;
double r55612 = -5.485072116683907e+154;
bool r55613 = r55611 <= r55612;
double r55614 = R;
double r55615 = 0.5;
double r55616 = phi2;
double r55617 = phi1;
double r55618 = r55616 + r55617;
double r55619 = r55615 * r55618;
double r55620 = cos(r55619);
double r55621 = -1.0;
double r55622 = r55621 / r55609;
double r55623 = r55620 / r55622;
double r55624 = r55614 * r55623;
double r55625 = 1.0159081511499582e+149;
bool r55626 = r55611 <= r55625;
double r55627 = r55617 + r55616;
double r55628 = 2.0;
double r55629 = r55627 / r55628;
double r55630 = cos(r55629);
double r55631 = r55611 * r55630;
double r55632 = r55631 * r55631;
double r55633 = r55617 - r55616;
double r55634 = r55633 * r55633;
double r55635 = r55632 + r55634;
double r55636 = sqrt(r55635);
double r55637 = r55614 * r55636;
double r55638 = 1.0;
double r55639 = r55638 / r55609;
double r55640 = r55620 / r55639;
double r55641 = r55614 * r55640;
double r55642 = r55626 ? r55637 : r55641;
double r55643 = r55613 ? r55624 : r55642;
return r55643;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (- lambda1 lambda2) < -5.485072116683907e+154Initial program 64.0
rmApplied add-exp-log64.0
rmApplied pow164.0
Applied log-pow64.0
Applied exp-prod64.0
Simplified64.0
Taylor expanded around -inf 49.7
Simplified47.7
if -5.485072116683907e+154 < (- lambda1 lambda2) < 1.0159081511499582e+149Initial program 23.0
if 1.0159081511499582e+149 < (- lambda1 lambda2) Initial program 63.1
rmApplied add-exp-log63.2
rmApplied pow163.2
Applied log-pow63.2
Applied exp-prod63.2
Simplified63.2
Taylor expanded around inf 50.6
Simplified48.5
Final simplification32.6
herbie shell --seed 2019303
(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))))))