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 6.155777733672295006444654850751127495103 \cdot 10^{305}:\\
\;\;\;\;\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)} \cdot R\\
\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 r82111 = R;
double r82112 = lambda1;
double r82113 = lambda2;
double r82114 = r82112 - r82113;
double r82115 = phi1;
double r82116 = phi2;
double r82117 = r82115 + r82116;
double r82118 = 2.0;
double r82119 = r82117 / r82118;
double r82120 = cos(r82119);
double r82121 = r82114 * r82120;
double r82122 = r82121 * r82121;
double r82123 = r82115 - r82116;
double r82124 = r82123 * r82123;
double r82125 = r82122 + r82124;
double r82126 = sqrt(r82125);
double r82127 = r82111 * r82126;
return r82127;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r82128 = lambda1;
double r82129 = lambda2;
double r82130 = r82128 - r82129;
double r82131 = phi1;
double r82132 = phi2;
double r82133 = r82131 + r82132;
double r82134 = 2.0;
double r82135 = r82133 / r82134;
double r82136 = cos(r82135);
double r82137 = r82130 * r82136;
double r82138 = r82137 * r82137;
double r82139 = r82131 - r82132;
double r82140 = r82139 * r82139;
double r82141 = r82138 + r82140;
double r82142 = 6.155777733672295e+305;
bool r82143 = r82141 <= r82142;
double r82144 = sqrt(r82141);
double r82145 = R;
double r82146 = r82144 * r82145;
double r82147 = r82132 - r82131;
double r82148 = r82145 * r82147;
double r82149 = r82143 ? r82146 : r82148;
return r82149;
}



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))) < 6.155777733672295e+305Initial program 1.8
rmApplied add-cbrt-cube1.9
Simplified1.9
rmApplied *-un-lft-identity1.9
Applied sqrt-prod1.9
Simplified1.9
Simplified1.8
if 6.155777733672295e+305 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.7
Taylor expanded around 0 46.8
Final simplification28.9
herbie shell --seed 2019235
(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))))))