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 4.605055345730565045055879951608156666024 \cdot 10^{305}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \frac{\left(\lambda_1 \cdot \lambda_1 - \lambda_2 \cdot \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)}{\lambda_1 + \lambda_2} + \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 r83661 = R;
double r83662 = lambda1;
double r83663 = lambda2;
double r83664 = r83662 - r83663;
double r83665 = phi1;
double r83666 = phi2;
double r83667 = r83665 + r83666;
double r83668 = 2.0;
double r83669 = r83667 / r83668;
double r83670 = cos(r83669);
double r83671 = r83664 * r83670;
double r83672 = r83671 * r83671;
double r83673 = r83665 - r83666;
double r83674 = r83673 * r83673;
double r83675 = r83672 + r83674;
double r83676 = sqrt(r83675);
double r83677 = r83661 * r83676;
return r83677;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r83678 = lambda1;
double r83679 = lambda2;
double r83680 = r83678 - r83679;
double r83681 = phi1;
double r83682 = phi2;
double r83683 = r83681 + r83682;
double r83684 = 2.0;
double r83685 = r83683 / r83684;
double r83686 = cos(r83685);
double r83687 = r83680 * r83686;
double r83688 = r83687 * r83687;
double r83689 = r83681 - r83682;
double r83690 = r83689 * r83689;
double r83691 = r83688 + r83690;
double r83692 = 4.605055345730565e+305;
bool r83693 = r83691 <= r83692;
double r83694 = R;
double r83695 = r83678 * r83678;
double r83696 = r83679 * r83679;
double r83697 = r83695 - r83696;
double r83698 = r83697 * r83686;
double r83699 = r83678 + r83679;
double r83700 = r83698 / r83699;
double r83701 = r83687 * r83700;
double r83702 = r83701 + r83690;
double r83703 = sqrt(r83702);
double r83704 = r83694 * r83703;
double r83705 = r83682 - r83681;
double r83706 = r83694 * r83705;
double r83707 = r83693 ? r83704 : r83706;
return r83707;
}



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))) < 4.605055345730565e+305Initial program 1.8
rmApplied flip--1.8
Applied associate-*l/1.8
if 4.605055345730565e+305 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.5
Taylor expanded around 0 46.4
Final simplification28.6
herbie shell --seed 2019325
(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))))))