Average Error: 37.1 → 3.8
Time: 25.4s
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 r1454644 = R;
        double r1454645 = lambda1;
        double r1454646 = lambda2;
        double r1454647 = r1454645 - r1454646;
        double r1454648 = phi1;
        double r1454649 = phi2;
        double r1454650 = r1454648 + r1454649;
        double r1454651 = 2.0;
        double r1454652 = r1454650 / r1454651;
        double r1454653 = cos(r1454652);
        double r1454654 = r1454647 * r1454653;
        double r1454655 = r1454654 * r1454654;
        double r1454656 = r1454648 - r1454649;
        double r1454657 = r1454656 * r1454656;
        double r1454658 = r1454655 + r1454657;
        double r1454659 = sqrt(r1454658);
        double r1454660 = r1454644 * r1454659;
        return r1454660;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r1454661 = R;
        double r1454662 = lambda1;
        double r1454663 = lambda2;
        double r1454664 = r1454662 - r1454663;
        double r1454665 = phi2;
        double r1454666 = phi1;
        double r1454667 = r1454665 + r1454666;
        double r1454668 = 2.0;
        double r1454669 = r1454667 / r1454668;
        double r1454670 = cos(r1454669);
        double r1454671 = expm1(r1454670);
        double r1454672 = log1p(r1454671);
        double r1454673 = r1454664 * r1454672;
        double r1454674 = r1454666 - r1454665;
        double r1454675 = hypot(r1454673, r1454674);
        double r1454676 = r1454661 * r1454675;
        return r1454676;
}

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