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 -1.2975233664675797 \cdot 10^{155}:\\
\;\;\;\;R \cdot e^{\log \left(\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)\right) - \log \left(\frac{-1}{\lambda_1}\right)}\\
\mathbf{elif}\;\lambda_1 - \lambda_2 \le 3.69636763241291605 \cdot 10^{140}:\\
\;\;\;\;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 e^{\log \left(\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)\right) - \log \left(\frac{1}{\lambda_1}\right)}\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r75150 = R;
double r75151 = lambda1;
double r75152 = lambda2;
double r75153 = r75151 - r75152;
double r75154 = phi1;
double r75155 = phi2;
double r75156 = r75154 + r75155;
double r75157 = 2.0;
double r75158 = r75156 / r75157;
double r75159 = cos(r75158);
double r75160 = r75153 * r75159;
double r75161 = r75160 * r75160;
double r75162 = r75154 - r75155;
double r75163 = r75162 * r75162;
double r75164 = r75161 + r75163;
double r75165 = sqrt(r75164);
double r75166 = r75150 * r75165;
return r75166;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r75167 = lambda1;
double r75168 = lambda2;
double r75169 = r75167 - r75168;
double r75170 = -1.2975233664675797e+155;
bool r75171 = r75169 <= r75170;
double r75172 = R;
double r75173 = 0.5;
double r75174 = phi2;
double r75175 = phi1;
double r75176 = r75174 + r75175;
double r75177 = r75173 * r75176;
double r75178 = cos(r75177);
double r75179 = log(r75178);
double r75180 = -1.0;
double r75181 = r75180 / r75167;
double r75182 = log(r75181);
double r75183 = r75179 - r75182;
double r75184 = exp(r75183);
double r75185 = r75172 * r75184;
double r75186 = 3.696367632412916e+140;
bool r75187 = r75169 <= r75186;
double r75188 = r75175 + r75174;
double r75189 = 2.0;
double r75190 = r75188 / r75189;
double r75191 = cos(r75190);
double r75192 = r75169 * r75191;
double r75193 = r75192 * r75192;
double r75194 = r75175 - r75174;
double r75195 = r75194 * r75194;
double r75196 = r75193 + r75195;
double r75197 = sqrt(r75196);
double r75198 = r75172 * r75197;
double r75199 = 1.0;
double r75200 = r75199 / r75167;
double r75201 = log(r75200);
double r75202 = r75179 - r75201;
double r75203 = exp(r75202);
double r75204 = r75172 * r75203;
double r75205 = r75187 ? r75198 : r75204;
double r75206 = r75171 ? r75185 : r75205;
return r75206;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (- lambda1 lambda2) < -1.2975233664675797e+155Initial program 64.0
rmApplied add-cube-cbrt64.0
rmApplied add-exp-log64.0
rmApplied pow164.0
Applied log-pow64.0
Applied exp-prod64.0
Simplified64.0
Taylor expanded around -inf 49.4
if -1.2975233664675797e+155 < (- lambda1 lambda2) < 3.696367632412916e+140Initial program 23.9
if 3.696367632412916e+140 < (- lambda1 lambda2) Initial program 61.0
rmApplied add-cube-cbrt61.0
rmApplied add-exp-log61.2
rmApplied pow161.2
Applied log-pow61.2
Applied exp-prod61.2
Simplified61.2
Taylor expanded around inf 50.4
Final simplification34.1
herbie shell --seed 2020062
(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))))))