Average Error: 37.2 → 3.8
Time: 29.7s
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 \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right)\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 \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right)\right), \phi_1 - \phi_2\right)
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r2768184 = R;
        double r2768185 = lambda1;
        double r2768186 = lambda2;
        double r2768187 = r2768185 - r2768186;
        double r2768188 = phi1;
        double r2768189 = phi2;
        double r2768190 = r2768188 + r2768189;
        double r2768191 = 2.0;
        double r2768192 = r2768190 / r2768191;
        double r2768193 = cos(r2768192);
        double r2768194 = r2768187 * r2768193;
        double r2768195 = r2768194 * r2768194;
        double r2768196 = r2768188 - r2768189;
        double r2768197 = r2768196 * r2768196;
        double r2768198 = r2768195 + r2768197;
        double r2768199 = sqrt(r2768198);
        double r2768200 = r2768184 * r2768199;
        return r2768200;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r2768201 = R;
        double r2768202 = lambda1;
        double r2768203 = lambda2;
        double r2768204 = r2768202 - r2768203;
        double r2768205 = phi2;
        double r2768206 = phi1;
        double r2768207 = r2768205 + r2768206;
        double r2768208 = 2.0;
        double r2768209 = r2768207 / r2768208;
        double r2768210 = cos(r2768209);
        double r2768211 = log1p(r2768210);
        double r2768212 = expm1(r2768211);
        double r2768213 = r2768204 * r2768212;
        double r2768214 = r2768206 - r2768205;
        double r2768215 = hypot(r2768213, r2768214);
        double r2768216 = r2768201 * r2768215;
        return r2768216;
}

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

    \[\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. Using strategy rm
  4. Applied expm1-log1p-u3.8

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

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

Reproduce

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