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}\;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)} = -\infty \lor \neg \left(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)} \le 2.6174821950400801 \cdot 10^{286}\right):\\
\;\;\;\;R \cdot \phi_2 + R \cdot \left(-\phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;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)}\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r87057 = R;
double r87058 = lambda1;
double r87059 = lambda2;
double r87060 = r87058 - r87059;
double r87061 = phi1;
double r87062 = phi2;
double r87063 = r87061 + r87062;
double r87064 = 2.0;
double r87065 = r87063 / r87064;
double r87066 = cos(r87065);
double r87067 = r87060 * r87066;
double r87068 = r87067 * r87067;
double r87069 = r87061 - r87062;
double r87070 = r87069 * r87069;
double r87071 = r87068 + r87070;
double r87072 = sqrt(r87071);
double r87073 = r87057 * r87072;
return r87073;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r87074 = R;
double r87075 = lambda1;
double r87076 = lambda2;
double r87077 = r87075 - r87076;
double r87078 = phi1;
double r87079 = phi2;
double r87080 = r87078 + r87079;
double r87081 = 2.0;
double r87082 = r87080 / r87081;
double r87083 = cos(r87082);
double r87084 = r87077 * r87083;
double r87085 = r87084 * r87084;
double r87086 = r87078 - r87079;
double r87087 = r87086 * r87086;
double r87088 = r87085 + r87087;
double r87089 = sqrt(r87088);
double r87090 = r87074 * r87089;
double r87091 = -inf.0;
bool r87092 = r87090 <= r87091;
double r87093 = 2.61748219504008e+286;
bool r87094 = r87090 <= r87093;
double r87095 = !r87094;
bool r87096 = r87092 || r87095;
double r87097 = r87074 * r87079;
double r87098 = -r87078;
double r87099 = r87074 * r87098;
double r87100 = r87097 + r87099;
double r87101 = r87096 ? r87100 : r87090;
return r87101;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < -inf.0 or 2.61748219504008e+286 < (* R (sqrt (+ (* (* (- 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.7
rmApplied sub-neg46.7
Applied distribute-lft-in46.7
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 2.61748219504008e+286Initial program 1.8
Final simplification28.2
herbie shell --seed 2020056
(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))))))