Average Error: 38.7 → 3.6
Time: 38.2s
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)}\]
\[\mathsf{hypot}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R\]
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(\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r7488928 = R;
        double r7488929 = lambda1;
        double r7488930 = lambda2;
        double r7488931 = r7488929 - r7488930;
        double r7488932 = phi1;
        double r7488933 = phi2;
        double r7488934 = r7488932 + r7488933;
        double r7488935 = 2.0;
        double r7488936 = r7488934 / r7488935;
        double r7488937 = cos(r7488936);
        double r7488938 = r7488931 * r7488937;
        double r7488939 = r7488938 * r7488938;
        double r7488940 = r7488932 - r7488933;
        double r7488941 = r7488940 * r7488940;
        double r7488942 = r7488939 + r7488941;
        double r7488943 = sqrt(r7488942);
        double r7488944 = r7488928 * r7488943;
        return r7488944;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r7488945 = phi1;
        double r7488946 = phi2;
        double r7488947 = r7488945 + r7488946;
        double r7488948 = 2.0;
        double r7488949 = r7488947 / r7488948;
        double r7488950 = cos(r7488949);
        double r7488951 = lambda1;
        double r7488952 = lambda2;
        double r7488953 = r7488951 - r7488952;
        double r7488954 = r7488950 * r7488953;
        double r7488955 = r7488945 - r7488946;
        double r7488956 = hypot(r7488954, r7488955);
        double r7488957 = R;
        double r7488958 = r7488956 * r7488957;
        return r7488958;
}

Error

Bits error versus R

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Initial program 38.7

    \[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}{\mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right) \cdot R}\]
  3. Using strategy rm
  4. Applied *-commutative3.6

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

    \[\leadsto \mathsf{hypot}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R\]

Reproduce

herbie shell --seed 2019173 +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.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))