Average Error: 37.2 → 3.7
Time: 25.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(\mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right) \cdot \left(\lambda_1 - \lambda_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(\mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right)
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r4740217 = R;
        double r4740218 = lambda1;
        double r4740219 = lambda2;
        double r4740220 = r4740218 - r4740219;
        double r4740221 = phi1;
        double r4740222 = phi2;
        double r4740223 = r4740221 + r4740222;
        double r4740224 = 2.0;
        double r4740225 = r4740223 / r4740224;
        double r4740226 = cos(r4740225);
        double r4740227 = r4740220 * r4740226;
        double r4740228 = r4740227 * r4740227;
        double r4740229 = r4740221 - r4740222;
        double r4740230 = r4740229 * r4740229;
        double r4740231 = r4740228 + r4740230;
        double r4740232 = sqrt(r4740231);
        double r4740233 = r4740217 * r4740232;
        return r4740233;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r4740234 = R;
        double r4740235 = phi1;
        double r4740236 = phi2;
        double r4740237 = r4740235 + r4740236;
        double r4740238 = 2.0;
        double r4740239 = r4740237 / r4740238;
        double r4740240 = cos(r4740239);
        double r4740241 = log1p(r4740240);
        double r4740242 = expm1(r4740241);
        double r4740243 = lambda1;
        double r4740244 = lambda2;
        double r4740245 = r4740243 - r4740244;
        double r4740246 = r4740242 * r4740245;
        double r4740247 = r4740235 - r4740236;
        double r4740248 = hypot(r4740246, r4740247);
        double r4740249 = r4740234 * r4740248;
        return r4740249;
}

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

    \[\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 *-commutative3.7

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

    \[\leadsto \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) \cdot R\]
  7. Final simplification3.7

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

Reproduce

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