Average Error: 39.3 → 3.8
Time: 45.8s
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 \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\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 \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right), \phi_1 - \phi_2\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r3986987 = R;
        double r3986988 = lambda1;
        double r3986989 = lambda2;
        double r3986990 = r3986988 - r3986989;
        double r3986991 = phi1;
        double r3986992 = phi2;
        double r3986993 = r3986991 + r3986992;
        double r3986994 = 2.0;
        double r3986995 = r3986993 / r3986994;
        double r3986996 = cos(r3986995);
        double r3986997 = r3986990 * r3986996;
        double r3986998 = r3986997 * r3986997;
        double r3986999 = r3986991 - r3986992;
        double r3987000 = r3986999 * r3986999;
        double r3987001 = r3986998 + r3987000;
        double r3987002 = sqrt(r3987001);
        double r3987003 = r3986987 * r3987002;
        return r3987003;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r3987004 = lambda1;
        double r3987005 = lambda2;
        double r3987006 = r3987004 - r3987005;
        double r3987007 = phi1;
        double r3987008 = phi2;
        double r3987009 = r3987007 + r3987008;
        double r3987010 = 2.0;
        double r3987011 = r3987009 / r3987010;
        double r3987012 = cos(r3987011);
        double r3987013 = log1p(r3987012);
        double r3987014 = expm1(r3987013);
        double r3987015 = r3987006 * r3987014;
        double r3987016 = r3987007 - r3987008;
        double r3987017 = hypot(r3987015, r3987016);
        double r3987018 = R;
        double r3987019 = r3987017 * r3987018;
        return r3987019;
}

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

    \[\leadsto \color{blue}{\mathsf{hypot}\left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R}\]
  3. Using strategy rm
  4. Applied *-commutative3.7

    \[\leadsto \color{blue}{R \cdot \mathsf{hypot}\left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right)}\]
  5. Using strategy rm
  6. Applied expm1-log1p-u3.8

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

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

Reproduce

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