Average Error: 37.3 → 3.9
Time: 27.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)}\]
\[\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 r3519476 = R;
        double r3519477 = lambda1;
        double r3519478 = lambda2;
        double r3519479 = r3519477 - r3519478;
        double r3519480 = phi1;
        double r3519481 = phi2;
        double r3519482 = r3519480 + r3519481;
        double r3519483 = 2.0;
        double r3519484 = r3519482 / r3519483;
        double r3519485 = cos(r3519484);
        double r3519486 = r3519479 * r3519485;
        double r3519487 = r3519486 * r3519486;
        double r3519488 = r3519480 - r3519481;
        double r3519489 = r3519488 * r3519488;
        double r3519490 = r3519487 + r3519489;
        double r3519491 = sqrt(r3519490);
        double r3519492 = r3519476 * r3519491;
        return r3519492;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r3519493 = lambda1;
        double r3519494 = lambda2;
        double r3519495 = r3519493 - r3519494;
        double r3519496 = phi2;
        double r3519497 = phi1;
        double r3519498 = r3519496 + r3519497;
        double r3519499 = 2.0;
        double r3519500 = r3519498 / r3519499;
        double r3519501 = cos(r3519500);
        double r3519502 = r3519495 * r3519501;
        double r3519503 = r3519497 - r3519496;
        double r3519504 = hypot(r3519502, r3519503);
        double r3519505 = R;
        double r3519506 = r3519504 * r3519505;
        return r3519506;
}

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 37.3

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

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

    \[\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 2019168 +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))))))