Average Error: 38.9 → 3.7
Time: 23.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 \cos \left(\frac{\phi_2 + \phi_1}{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(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_2 + \phi_1}{2}\right), \phi_1 - \phi_2\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r3204324 = R;
        double r3204325 = lambda1;
        double r3204326 = lambda2;
        double r3204327 = r3204325 - r3204326;
        double r3204328 = phi1;
        double r3204329 = phi2;
        double r3204330 = r3204328 + r3204329;
        double r3204331 = 2.0;
        double r3204332 = r3204330 / r3204331;
        double r3204333 = cos(r3204332);
        double r3204334 = r3204327 * r3204333;
        double r3204335 = r3204334 * r3204334;
        double r3204336 = r3204328 - r3204329;
        double r3204337 = r3204336 * r3204336;
        double r3204338 = r3204335 + r3204337;
        double r3204339 = sqrt(r3204338);
        double r3204340 = r3204324 * r3204339;
        return r3204340;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r3204341 = lambda1;
        double r3204342 = lambda2;
        double r3204343 = r3204341 - r3204342;
        double r3204344 = phi2;
        double r3204345 = phi1;
        double r3204346 = r3204344 + r3204345;
        double r3204347 = 2.0;
        double r3204348 = r3204346 / r3204347;
        double r3204349 = cos(r3204348);
        double r3204350 = r3204343 * r3204349;
        double r3204351 = r3204345 - r3204344;
        double r3204352 = hypot(r3204350, r3204351);
        double r3204353 = R;
        double r3204354 = r3204352 * r3204353;
        return r3204354;
}

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.9

    \[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.7

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

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

Reproduce

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