Average Error: 39.2 → 3.6
Time: 6.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)}\]
\[R \cdot \mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right)\]
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)}
R \cdot \mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right)
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r79022 = R;
        double r79023 = lambda1;
        double r79024 = lambda2;
        double r79025 = r79023 - r79024;
        double r79026 = phi1;
        double r79027 = phi2;
        double r79028 = r79026 + r79027;
        double r79029 = 2.0;
        double r79030 = r79028 / r79029;
        double r79031 = cos(r79030);
        double r79032 = r79025 * r79031;
        double r79033 = r79032 * r79032;
        double r79034 = r79026 - r79027;
        double r79035 = r79034 * r79034;
        double r79036 = r79033 + r79035;
        double r79037 = sqrt(r79036);
        double r79038 = r79022 * r79037;
        return r79038;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r79039 = R;
        double r79040 = lambda1;
        double r79041 = lambda2;
        double r79042 = r79040 - r79041;
        double r79043 = phi1;
        double r79044 = phi2;
        double r79045 = r79043 + r79044;
        double r79046 = 2.0;
        double r79047 = r79045 / r79046;
        double r79048 = cos(r79047);
        double r79049 = r79042 * r79048;
        double r79050 = r79043 - r79044;
        double r79051 = hypot(r79049, r79050);
        double r79052 = r79039 * r79051;
        return r79052;
}

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

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

    \[\leadsto \color{blue}{{\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)\right)}^{1}} \cdot R\]
  5. Final simplification3.6

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

Reproduce

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