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(\left(\cos \left(\phi_2 \cdot \frac{1}{2}\right) \cdot \cos \left(\phi_1 \cdot \frac{1}{2}\right) - \sqrt[3]{\left(\left(\sin \left(\phi_1 \cdot \frac{1}{2}\right) \cdot \sin \left(\phi_2 \cdot \frac{1}{2}\right)\right) \cdot \left(\sin \left(\phi_1 \cdot \frac{1}{2}\right) \cdot \sin \left(\phi_2 \cdot \frac{1}{2}\right)\right)\right) \cdot \left(\sin \left(\phi_1 \cdot \frac{1}{2}\right) \cdot \sin \left(\phi_2 \cdot \frac{1}{2}\right)\right)}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4777120 = R;
double r4777121 = lambda1;
double r4777122 = lambda2;
double r4777123 = r4777121 - r4777122;
double r4777124 = phi1;
double r4777125 = phi2;
double r4777126 = r4777124 + r4777125;
double r4777127 = 2.0;
double r4777128 = r4777126 / r4777127;
double r4777129 = cos(r4777128);
double r4777130 = r4777123 * r4777129;
double r4777131 = r4777130 * r4777130;
double r4777132 = r4777124 - r4777125;
double r4777133 = r4777132 * r4777132;
double r4777134 = r4777131 + r4777133;
double r4777135 = sqrt(r4777134);
double r4777136 = r4777120 * r4777135;
return r4777136;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4777137 = phi2;
double r4777138 = 0.5;
double r4777139 = r4777137 * r4777138;
double r4777140 = cos(r4777139);
double r4777141 = phi1;
double r4777142 = r4777141 * r4777138;
double r4777143 = cos(r4777142);
double r4777144 = r4777140 * r4777143;
double r4777145 = sin(r4777142);
double r4777146 = sin(r4777139);
double r4777147 = r4777145 * r4777146;
double r4777148 = r4777147 * r4777147;
double r4777149 = r4777148 * r4777147;
double r4777150 = cbrt(r4777149);
double r4777151 = r4777144 - r4777150;
double r4777152 = lambda1;
double r4777153 = lambda2;
double r4777154 = r4777152 - r4777153;
double r4777155 = r4777151 * r4777154;
double r4777156 = r4777141 - r4777137;
double r4777157 = hypot(r4777155, r4777156);
double r4777158 = R;
double r4777159 = r4777157 * r4777158;
return r4777159;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 36.5
Simplified3.7
Taylor expanded around inf 3.7
rmApplied distribute-rgt-in3.7
Applied cos-sum0.1
rmApplied add-cbrt-cube0.1
Final simplification0.1
herbie shell --seed 2019162 +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))))))