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 2.2870988957810845 \cdot 10^{298}:\\
\;\;\;\;R \cdot \sqrt{\left({\left(\cos \left(0.5 \cdot \phi_2\right) \cdot \cos \left(0.5 \cdot \phi_1\right) - \sin \left(0.5 \cdot \phi_2\right) \cdot \sin \left(0.5 \cdot \phi_1\right)\right)}^{2} \cdot \left({\lambda_1}^{2} + {\lambda_2}^{2}\right) - 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)\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 r120041 = R;
double r120042 = lambda1;
double r120043 = lambda2;
double r120044 = r120042 - r120043;
double r120045 = phi1;
double r120046 = phi2;
double r120047 = r120045 + r120046;
double r120048 = 2.0;
double r120049 = r120047 / r120048;
double r120050 = cos(r120049);
double r120051 = r120044 * r120050;
double r120052 = r120051 * r120051;
double r120053 = r120045 - r120046;
double r120054 = r120053 * r120053;
double r120055 = r120052 + r120054;
double r120056 = sqrt(r120055);
double r120057 = r120041 * r120056;
return r120057;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r120058 = lambda1;
double r120059 = lambda2;
double r120060 = r120058 - r120059;
double r120061 = phi1;
double r120062 = phi2;
double r120063 = r120061 + r120062;
double r120064 = 2.0;
double r120065 = r120063 / r120064;
double r120066 = cos(r120065);
double r120067 = r120060 * r120066;
double r120068 = r120067 * r120067;
double r120069 = r120061 - r120062;
double r120070 = r120069 * r120069;
double r120071 = r120068 + r120070;
double r120072 = 2.2870988957810845e+298;
bool r120073 = r120071 <= r120072;
double r120074 = R;
double r120075 = 0.5;
double r120076 = r120075 * r120062;
double r120077 = cos(r120076);
double r120078 = r120075 * r120061;
double r120079 = cos(r120078);
double r120080 = r120077 * r120079;
double r120081 = sin(r120076);
double r120082 = sin(r120078);
double r120083 = r120081 * r120082;
double r120084 = r120080 - r120083;
double r120085 = 2.0;
double r120086 = pow(r120084, r120085);
double r120087 = pow(r120058, r120085);
double r120088 = pow(r120059, r120085);
double r120089 = r120087 + r120088;
double r120090 = r120086 * r120089;
double r120091 = r120062 + r120061;
double r120092 = r120075 * r120091;
double r120093 = cos(r120092);
double r120094 = pow(r120093, r120085);
double r120095 = r120094 * r120058;
double r120096 = r120059 * r120095;
double r120097 = r120085 * r120096;
double r120098 = r120090 - r120097;
double r120099 = r120098 + r120070;
double r120100 = sqrt(r120099);
double r120101 = r120074 * r120100;
double r120102 = r120062 - r120061;
double r120103 = r120074 * r120102;
double r120104 = r120073 ? r120101 : r120103;
return r120104;
}



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))) < 2.2870988957810845e+298Initial program 2.0
Taylor expanded around inf 2.0
Simplified2.0
rmApplied distribute-lft-in2.0
Applied cos-sum0.9
if 2.2870988957810845e+298 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 62.7
Taylor expanded around 0 47.6
Final simplification29.0
herbie shell --seed 2020045
(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))))))