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)}R \cdot \mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r79022 = R;
double r79023 = lambda1;
double r79024 = lambda2;
double r79025 = r79023 - r79024;
double r79026 = phi1;
double r79027 = phi2;
double r79028 = r79026 + r79027;
double r79029 = 2.0;
double r79030 = r79028 / r79029;
double r79031 = cos(r79030);
double r79032 = r79025 * r79031;
double r79033 = r79032 * r79032;
double r79034 = r79026 - r79027;
double r79035 = r79034 * r79034;
double r79036 = r79033 + r79035;
double r79037 = sqrt(r79036);
double r79038 = r79022 * r79037;
return r79038;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r79039 = R;
double r79040 = lambda1;
double r79041 = lambda2;
double r79042 = r79040 - r79041;
double r79043 = phi1;
double r79044 = phi2;
double r79045 = r79043 + r79044;
double r79046 = 2.0;
double r79047 = r79045 / r79046;
double r79048 = cos(r79047);
double r79049 = r79042 * r79048;
double r79050 = r79043 - r79044;
double r79051 = hypot(r79049, r79050);
double r79052 = r79039 * r79051;
return r79052;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.2
Simplified3.6
rmApplied pow13.6
Final simplification3.6
herbie shell --seed 2020060 +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))))))