Average Error: 38.9 → 34.1
Time: 15.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)}\]
\[\begin{array}{l} \mathbf{if}\;\phi_1 \le -2.50401835654202499 \cdot 10^{59} \lor \neg \left(\phi_1 \le 6.95681086624963382 \cdot 10^{104}\right):\\ \;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\ \mathbf{else}:\\ \;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{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)}\\ \end{array}\]
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)}
\begin{array}{l}
\mathbf{if}\;\phi_1 \le -2.50401835654202499 \cdot 10^{59} \lor \neg \left(\phi_1 \le 6.95681086624963382 \cdot 10^{104}\right):\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\

\mathbf{else}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{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)}\\

\end{array}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r95066 = R;
        double r95067 = lambda1;
        double r95068 = lambda2;
        double r95069 = r95067 - r95068;
        double r95070 = phi1;
        double r95071 = phi2;
        double r95072 = r95070 + r95071;
        double r95073 = 2.0;
        double r95074 = r95072 / r95073;
        double r95075 = cos(r95074);
        double r95076 = r95069 * r95075;
        double r95077 = r95076 * r95076;
        double r95078 = r95070 - r95071;
        double r95079 = r95078 * r95078;
        double r95080 = r95077 + r95079;
        double r95081 = sqrt(r95080);
        double r95082 = r95066 * r95081;
        return r95082;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r95083 = phi1;
        double r95084 = -2.504018356542025e+59;
        bool r95085 = r95083 <= r95084;
        double r95086 = 6.956810866249634e+104;
        bool r95087 = r95083 <= r95086;
        double r95088 = !r95087;
        bool r95089 = r95085 || r95088;
        double r95090 = R;
        double r95091 = phi2;
        double r95092 = r95091 - r95083;
        double r95093 = r95090 * r95092;
        double r95094 = lambda1;
        double r95095 = lambda2;
        double r95096 = r95094 - r95095;
        double r95097 = r95096 * r95096;
        double r95098 = r95083 + r95091;
        double r95099 = 2.0;
        double r95100 = r95098 / r95099;
        double r95101 = cos(r95100);
        double r95102 = r95101 * r95101;
        double r95103 = r95097 * r95102;
        double r95104 = r95083 - r95091;
        double r95105 = r95104 * r95104;
        double r95106 = r95103 + r95105;
        double r95107 = sqrt(r95106);
        double r95108 = r95090 * r95107;
        double r95109 = r95089 ? r95093 : r95108;
        return r95109;
}

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. Split input into 2 regimes
  2. if phi1 < -2.504018356542025e+59 or 6.956810866249634e+104 < phi1

    1. Initial program 53.7

      \[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. Taylor expanded around 0 38.9

      \[\leadsto R \cdot \color{blue}{\left(\phi_2 - \phi_1\right)}\]

    if -2.504018356542025e+59 < phi1 < 6.956810866249634e+104

    1. Initial program 31.7

      \[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. Using strategy rm
    3. Applied swap-sqr31.7

      \[\leadsto R \cdot \sqrt{\color{blue}{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{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)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification34.1

    \[\leadsto \begin{array}{l} \mathbf{if}\;\phi_1 \le -2.50401835654202499 \cdot 10^{59} \lor \neg \left(\phi_1 \le 6.95681086624963382 \cdot 10^{104}\right):\\ \;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\ \mathbf{else}:\\ \;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{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)}\\ \end{array}\]

Reproduce

herbie shell --seed 2020047 
(FPCore (R lambda1 lambda2 phi1 phi2)
  :name "Equirectangular approximation to distance on a great circle"
  :precision binary64
  (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))