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(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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) \le 8.229130322930406577428232878090474495932 \cdot 10^{303}:\\
\;\;\;\;R \cdot \sqrt{\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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)}\\
\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 r5119114 = R;
double r5119115 = lambda1;
double r5119116 = lambda2;
double r5119117 = r5119115 - r5119116;
double r5119118 = phi1;
double r5119119 = phi2;
double r5119120 = r5119118 + r5119119;
double r5119121 = 2.0;
double r5119122 = r5119120 / r5119121;
double r5119123 = cos(r5119122);
double r5119124 = r5119117 * r5119123;
double r5119125 = r5119124 * r5119124;
double r5119126 = r5119118 - r5119119;
double r5119127 = r5119126 * r5119126;
double r5119128 = r5119125 + r5119127;
double r5119129 = sqrt(r5119128);
double r5119130 = r5119114 * r5119129;
return r5119130;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r5119131 = phi1;
double r5119132 = phi2;
double r5119133 = r5119131 - r5119132;
double r5119134 = r5119133 * r5119133;
double r5119135 = lambda1;
double r5119136 = lambda2;
double r5119137 = r5119135 - r5119136;
double r5119138 = r5119131 + r5119132;
double r5119139 = 2.0;
double r5119140 = r5119138 / r5119139;
double r5119141 = cos(r5119140);
double r5119142 = r5119137 * r5119141;
double r5119143 = r5119142 * r5119142;
double r5119144 = r5119134 + r5119143;
double r5119145 = 8.229130322930407e+303;
bool r5119146 = r5119144 <= r5119145;
double r5119147 = R;
double r5119148 = sqrt(r5119144);
double r5119149 = r5119147 * r5119148;
double r5119150 = r5119132 - r5119131;
double r5119151 = r5119147 * r5119150;
double r5119152 = r5119146 ? r5119149 : r5119151;
return r5119152;
}



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))) < 8.229130322930407e+303Initial program 2.0
if 8.229130322930407e+303 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.4
Taylor expanded around 0 46.8
Final simplification29.7
herbie shell --seed 2019174
(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))))))