Average Error: 37.8 → 3.6
Time: 29.6s
Precision: 64
\[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_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)^2 + \left(\phi_1 - \phi_2\right)^2}^* \cdot R\]
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r12784883 = R;
        double r12784884 = lambda1;
        double r12784885 = lambda2;
        double r12784886 = r12784884 - r12784885;
        double r12784887 = phi1;
        double r12784888 = phi2;
        double r12784889 = r12784887 + r12784888;
        double r12784890 = 2.0;
        double r12784891 = r12784889 / r12784890;
        double r12784892 = cos(r12784891);
        double r12784893 = r12784886 * r12784892;
        double r12784894 = r12784893 * r12784893;
        double r12784895 = r12784887 - r12784888;
        double r12784896 = r12784895 * r12784895;
        double r12784897 = r12784894 + r12784896;
        double r12784898 = sqrt(r12784897);
        double r12784899 = r12784883 * r12784898;
        return r12784899;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r12784900 = lambda1;
        double r12784901 = lambda2;
        double r12784902 = r12784900 - r12784901;
        double r12784903 = phi1;
        double r12784904 = phi2;
        double r12784905 = r12784903 + r12784904;
        double r12784906 = 2.0;
        double r12784907 = r12784905 / r12784906;
        double r12784908 = cos(r12784907);
        double r12784909 = r12784902 * r12784908;
        double r12784910 = r12784903 - r12784904;
        double r12784911 = hypot(r12784909, r12784910);
        double r12784912 = R;
        double r12784913 = r12784911 * r12784912;
        return r12784913;
}

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_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)^2 + \left(\phi_1 - \phi_2\right)^2}^* \cdot R

Error

Bits error versus R

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 37.8

    \[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)}\]
  2. Simplified3.6

    \[\leadsto \color{blue}{\sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right)^2 + \left(\phi_1 - \phi_2\right)^2}^* \cdot R}\]
  3. Using strategy rm
  4. Applied *-commutative3.6

    \[\leadsto \color{blue}{R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right)^2 + \left(\phi_1 - \phi_2\right)^2}^*}\]
  5. Final simplification3.6

    \[\leadsto \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)^2 + \left(\phi_1 - \phi_2\right)^2}^* \cdot R\]

Reproduce

herbie shell --seed 2019102 +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))))))