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)}\sqrt{\left(\left(\lambda_2 - \lambda_1\right) \cdot \left(\sin \left(\frac{1}{2} \cdot \phi_1\right) \cdot \sin \left(\frac{1}{2} \cdot \phi_2\right)\right) - \left(\lambda_2 - \lambda_1\right) \cdot \left(\cos \left(\frac{1}{2} \cdot \phi_1\right) \cdot \cos \left(\frac{1}{2} \cdot \phi_2\right)\right)\right)^2 + \left(\phi_1 - \phi_2\right)^2}^* \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r18644976 = R;
double r18644977 = lambda1;
double r18644978 = lambda2;
double r18644979 = r18644977 - r18644978;
double r18644980 = phi1;
double r18644981 = phi2;
double r18644982 = r18644980 + r18644981;
double r18644983 = 2.0;
double r18644984 = r18644982 / r18644983;
double r18644985 = cos(r18644984);
double r18644986 = r18644979 * r18644985;
double r18644987 = r18644986 * r18644986;
double r18644988 = r18644980 - r18644981;
double r18644989 = r18644988 * r18644988;
double r18644990 = r18644987 + r18644989;
double r18644991 = sqrt(r18644990);
double r18644992 = r18644976 * r18644991;
return r18644992;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r18644993 = lambda2;
double r18644994 = lambda1;
double r18644995 = r18644993 - r18644994;
double r18644996 = 0.5;
double r18644997 = phi1;
double r18644998 = r18644996 * r18644997;
double r18644999 = sin(r18644998);
double r18645000 = phi2;
double r18645001 = r18644996 * r18645000;
double r18645002 = sin(r18645001);
double r18645003 = r18644999 * r18645002;
double r18645004 = r18644995 * r18645003;
double r18645005 = cos(r18644998);
double r18645006 = cos(r18645001);
double r18645007 = r18645005 * r18645006;
double r18645008 = r18644995 * r18645007;
double r18645009 = r18645004 - r18645008;
double r18645010 = r18644997 - r18645000;
double r18645011 = hypot(r18645009, r18645010);
double r18645012 = R;
double r18645013 = r18645011 * r18645012;
return r18645013;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 37.5
Simplified3.8
Taylor expanded around inf 3.8
rmApplied distribute-lft-in3.8
Applied cos-sum0.1
Taylor expanded around inf 0.1
Simplified0.1
Final simplification0.1
herbie shell --seed 2019119 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))