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 9.763007400432452359514504801297217953397 \cdot 10^{300}:\\
\;\;\;\;R \cdot \sqrt{\left(\left({\left(\cos \left(0.5 \cdot \phi_2\right)\right)}^{2} \cdot \left({\left(\cos \left(0.5 \cdot \phi_1\right)\right)}^{2} \cdot {\lambda_2}^{2}\right) + \left({\left(\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)\right)}^{2} \cdot {\lambda_1}^{2} + {\left(\sin \left(0.5 \cdot \phi_2\right)\right)}^{2} \cdot \left({\lambda_2}^{2} \cdot {\left(\sin \left(0.5 \cdot \phi_1\right)\right)}^{2}\right)\right)\right) - \left(\cos \left(0.5 \cdot \phi_2\right) \cdot \left(\sin \left(0.5 \cdot \phi_1\right) \cdot \left(\cos \left(0.5 \cdot \phi_1\right) \cdot \left(\sin \left(0.5 \cdot \phi_2\right) \cdot {\lambda_2}^{2}\right)\right)\right) + \left(2 \cdot \left(\lambda_2 \cdot \left({\left(\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)\right)}^{2} \cdot \lambda_1\right)\right) + \cos \left(0.5 \cdot \phi_1\right) \cdot \left(\sin \left(0.5 \cdot \phi_2\right) \cdot \left(\cos \left(0.5 \cdot \phi_2\right) \cdot \left(\sin \left(0.5 \cdot \phi_1\right) \cdot {\lambda_2}^{2}\right)\right)\right)\right)\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 r111699 = R;
double r111700 = lambda1;
double r111701 = lambda2;
double r111702 = r111700 - r111701;
double r111703 = phi1;
double r111704 = phi2;
double r111705 = r111703 + r111704;
double r111706 = 2.0;
double r111707 = r111705 / r111706;
double r111708 = cos(r111707);
double r111709 = r111702 * r111708;
double r111710 = r111709 * r111709;
double r111711 = r111703 - r111704;
double r111712 = r111711 * r111711;
double r111713 = r111710 + r111712;
double r111714 = sqrt(r111713);
double r111715 = r111699 * r111714;
return r111715;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r111716 = lambda1;
double r111717 = lambda2;
double r111718 = r111716 - r111717;
double r111719 = phi1;
double r111720 = phi2;
double r111721 = r111719 + r111720;
double r111722 = 2.0;
double r111723 = r111721 / r111722;
double r111724 = cos(r111723);
double r111725 = r111718 * r111724;
double r111726 = r111725 * r111725;
double r111727 = r111719 - r111720;
double r111728 = r111727 * r111727;
double r111729 = r111726 + r111728;
double r111730 = 9.763007400432452e+300;
bool r111731 = r111729 <= r111730;
double r111732 = R;
double r111733 = 0.5;
double r111734 = r111733 * r111720;
double r111735 = cos(r111734);
double r111736 = 2.0;
double r111737 = pow(r111735, r111736);
double r111738 = r111733 * r111719;
double r111739 = cos(r111738);
double r111740 = pow(r111739, r111736);
double r111741 = pow(r111717, r111736);
double r111742 = r111740 * r111741;
double r111743 = r111737 * r111742;
double r111744 = r111720 + r111719;
double r111745 = r111733 * r111744;
double r111746 = cos(r111745);
double r111747 = pow(r111746, r111736);
double r111748 = pow(r111716, r111736);
double r111749 = r111747 * r111748;
double r111750 = sin(r111734);
double r111751 = pow(r111750, r111736);
double r111752 = sin(r111738);
double r111753 = pow(r111752, r111736);
double r111754 = r111741 * r111753;
double r111755 = r111751 * r111754;
double r111756 = r111749 + r111755;
double r111757 = r111743 + r111756;
double r111758 = r111750 * r111741;
double r111759 = r111739 * r111758;
double r111760 = r111752 * r111759;
double r111761 = r111735 * r111760;
double r111762 = r111747 * r111716;
double r111763 = r111717 * r111762;
double r111764 = r111736 * r111763;
double r111765 = r111752 * r111741;
double r111766 = r111735 * r111765;
double r111767 = r111750 * r111766;
double r111768 = r111739 * r111767;
double r111769 = r111764 + r111768;
double r111770 = r111761 + r111769;
double r111771 = r111757 - r111770;
double r111772 = r111771 + r111728;
double r111773 = sqrt(r111772);
double r111774 = r111732 * r111773;
double r111775 = r111720 - r111719;
double r111776 = r111732 * r111775;
double r111777 = r111731 ? r111774 : r111776;
return r111777;
}



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))) < 9.763007400432452e+300Initial program 1.6
Taylor expanded around inf 1.6
rmApplied distribute-lft-in1.6
Applied cos-sum1.0
Simplified1.0
Simplified1.0
Taylor expanded around -inf 1.0
if 9.763007400432452e+300 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 62.9
Taylor expanded around 0 46.2
Final simplification28.5
herbie shell --seed 2019318
(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))))))