Average Error: 37.1 → 3.8
Time: 28.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{log1p}\left(\mathsf{expm1}\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{log1p}\left(\mathsf{expm1}\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 r1437344 = R;
        double r1437345 = lambda1;
        double r1437346 = lambda2;
        double r1437347 = r1437345 - r1437346;
        double r1437348 = phi1;
        double r1437349 = phi2;
        double r1437350 = r1437348 + r1437349;
        double r1437351 = 2.0;
        double r1437352 = r1437350 / r1437351;
        double r1437353 = cos(r1437352);
        double r1437354 = r1437347 * r1437353;
        double r1437355 = r1437354 * r1437354;
        double r1437356 = r1437348 - r1437349;
        double r1437357 = r1437356 * r1437356;
        double r1437358 = r1437355 + r1437357;
        double r1437359 = sqrt(r1437358);
        double r1437360 = r1437344 * r1437359;
        return r1437360;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r1437361 = R;
        double r1437362 = lambda1;
        double r1437363 = lambda2;
        double r1437364 = r1437362 - r1437363;
        double r1437365 = phi2;
        double r1437366 = phi1;
        double r1437367 = r1437365 + r1437366;
        double r1437368 = 2.0;
        double r1437369 = r1437367 / r1437368;
        double r1437370 = cos(r1437369);
        double r1437371 = expm1(r1437370);
        double r1437372 = log1p(r1437371);
        double r1437373 = r1437364 * r1437372;
        double r1437374 = r1437366 - r1437365;
        double r1437375 = hypot(r1437373, r1437374);
        double r1437376 = r1437361 * r1437375;
        return r1437376;
}

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

    \[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 log1p-expm1-u3.8

    \[\leadsto \mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \color{blue}{\mathsf{log1p}\left(\mathsf{expm1}\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{log1p}\left(\mathsf{expm1}\left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right)\right), \phi_1 - \phi_2\right)\]

Reproduce

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