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)}\mathsf{hypot}\left(\frac{\left({\left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)\right)}^{3} - \sqrt[3]{{\left({\left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)}^{3}\right)}^{3}}\right) \cdot \left(\lambda_1 - \lambda_2\right)}{\left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)\right) \cdot \left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)\right) + \left(\left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right) \cdot \left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right) + \left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)\right) \cdot \left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)\right)}, \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r73081 = R;
double r73082 = lambda1;
double r73083 = lambda2;
double r73084 = r73082 - r73083;
double r73085 = phi1;
double r73086 = phi2;
double r73087 = r73085 + r73086;
double r73088 = 2.0;
double r73089 = r73087 / r73088;
double r73090 = cos(r73089);
double r73091 = r73084 * r73090;
double r73092 = r73091 * r73091;
double r73093 = r73085 - r73086;
double r73094 = r73093 * r73093;
double r73095 = r73092 + r73094;
double r73096 = sqrt(r73095);
double r73097 = r73081 * r73096;
return r73097;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r73098 = phi2;
double r73099 = 0.5;
double r73100 = r73098 * r73099;
double r73101 = cos(r73100);
double r73102 = phi1;
double r73103 = r73102 * r73099;
double r73104 = cos(r73103);
double r73105 = r73101 * r73104;
double r73106 = 3.0;
double r73107 = pow(r73105, r73106);
double r73108 = sin(r73100);
double r73109 = sin(r73103);
double r73110 = r73108 * r73109;
double r73111 = pow(r73110, r73106);
double r73112 = pow(r73111, r73106);
double r73113 = cbrt(r73112);
double r73114 = r73107 - r73113;
double r73115 = lambda1;
double r73116 = lambda2;
double r73117 = r73115 - r73116;
double r73118 = r73114 * r73117;
double r73119 = r73105 * r73105;
double r73120 = r73110 * r73110;
double r73121 = r73105 * r73110;
double r73122 = r73120 + r73121;
double r73123 = r73119 + r73122;
double r73124 = r73118 / r73123;
double r73125 = r73102 - r73098;
double r73126 = hypot(r73124, r73125);
double r73127 = R;
double r73128 = r73126 * r73127;
return r73128;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 38.7
Simplified3.6
Taylor expanded around inf 3.6
Simplified3.6
rmApplied distribute-lft-in3.6
Applied cos-sum0.1
Simplified0.1
Simplified0.1
rmApplied flip3--0.2
Applied associate-*l/0.2
rmApplied add-cbrt-cube0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2020003 +o rules:numerics
(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))))))