Average Error: 37.5 → 3.6
Time: 30.1s
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 \cos \left(\frac{\phi_2 + \phi_1}{2}\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 \cos \left(\frac{\phi_2 + \phi_1}{2}\right), \phi_1 - \phi_2\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r3331089 = R;
        double r3331090 = lambda1;
        double r3331091 = lambda2;
        double r3331092 = r3331090 - r3331091;
        double r3331093 = phi1;
        double r3331094 = phi2;
        double r3331095 = r3331093 + r3331094;
        double r3331096 = 2.0;
        double r3331097 = r3331095 / r3331096;
        double r3331098 = cos(r3331097);
        double r3331099 = r3331092 * r3331098;
        double r3331100 = r3331099 * r3331099;
        double r3331101 = r3331093 - r3331094;
        double r3331102 = r3331101 * r3331101;
        double r3331103 = r3331100 + r3331102;
        double r3331104 = sqrt(r3331103);
        double r3331105 = r3331089 * r3331104;
        return r3331105;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r3331106 = lambda1;
        double r3331107 = lambda2;
        double r3331108 = r3331106 - r3331107;
        double r3331109 = phi2;
        double r3331110 = phi1;
        double r3331111 = r3331109 + r3331110;
        double r3331112 = 2.0;
        double r3331113 = r3331111 / r3331112;
        double r3331114 = cos(r3331113);
        double r3331115 = r3331108 * r3331114;
        double r3331116 = r3331110 - r3331109;
        double r3331117 = hypot(r3331115, r3331116);
        double r3331118 = R;
        double r3331119 = r3331117 * r3331118;
        return r3331119;
}

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

    \[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.6

    \[\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. Final simplification3.6

    \[\leadsto \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\]

Reproduce

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