Average Error: 38.9 → 3.6
Time: 7.3s
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_1 + \phi_2}{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_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r90323 = R;
        double r90324 = lambda1;
        double r90325 = lambda2;
        double r90326 = r90324 - r90325;
        double r90327 = phi1;
        double r90328 = phi2;
        double r90329 = r90327 + r90328;
        double r90330 = 2.0;
        double r90331 = r90329 / r90330;
        double r90332 = cos(r90331);
        double r90333 = r90326 * r90332;
        double r90334 = r90333 * r90333;
        double r90335 = r90327 - r90328;
        double r90336 = r90335 * r90335;
        double r90337 = r90334 + r90336;
        double r90338 = sqrt(r90337);
        double r90339 = r90323 * r90338;
        return r90339;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r90340 = lambda1;
        double r90341 = lambda2;
        double r90342 = r90340 - r90341;
        double r90343 = phi1;
        double r90344 = phi2;
        double r90345 = r90343 + r90344;
        double r90346 = 2.0;
        double r90347 = r90345 / r90346;
        double r90348 = cos(r90347);
        double r90349 = r90342 * r90348;
        double r90350 = r90343 - r90344;
        double r90351 = hypot(r90349, r90350);
        double r90352 = R;
        double r90353 = r90351 * r90352;
        return r90353;
}

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.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 \color{blue}{1 \cdot \left(\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\right)}\]
  5. Final simplification3.6

    \[\leadsto \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\]

Reproduce

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