Average Error: 39.1 → 3.6
Time: 7.5s
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(\left(\lambda_1 - \lambda_2\right) \cdot \left(1 \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\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(\left(\lambda_1 - \lambda_2\right) \cdot \left(1 \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right), \phi_1 - \phi_2\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r77069 = R;
        double r77070 = lambda1;
        double r77071 = lambda2;
        double r77072 = r77070 - r77071;
        double r77073 = phi1;
        double r77074 = phi2;
        double r77075 = r77073 + r77074;
        double r77076 = 2.0;
        double r77077 = r77075 / r77076;
        double r77078 = cos(r77077);
        double r77079 = r77072 * r77078;
        double r77080 = r77079 * r77079;
        double r77081 = r77073 - r77074;
        double r77082 = r77081 * r77081;
        double r77083 = r77080 + r77082;
        double r77084 = sqrt(r77083);
        double r77085 = r77069 * r77084;
        return r77085;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r77086 = lambda1;
        double r77087 = lambda2;
        double r77088 = r77086 - r77087;
        double r77089 = 1.0;
        double r77090 = phi1;
        double r77091 = phi2;
        double r77092 = r77090 + r77091;
        double r77093 = 2.0;
        double r77094 = r77092 / r77093;
        double r77095 = cos(r77094);
        double r77096 = r77089 * r77095;
        double r77097 = r77088 * r77096;
        double r77098 = r77090 - r77091;
        double r77099 = hypot(r77097, r77098);
        double r77100 = R;
        double r77101 = r77099 * r77100;
        return r77101;
}

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 39.1

    \[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 *-un-lft-identity3.6

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

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

Reproduce

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