Average Error: 38.9 → 34.1
Time: 15.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)}\]
\[\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 r114355 = R;
        double r114356 = lambda1;
        double r114357 = lambda2;
        double r114358 = r114356 - r114357;
        double r114359 = phi1;
        double r114360 = phi2;
        double r114361 = r114359 + r114360;
        double r114362 = 2.0;
        double r114363 = r114361 / r114362;
        double r114364 = cos(r114363);
        double r114365 = r114358 * r114364;
        double r114366 = r114365 * r114365;
        double r114367 = r114359 - r114360;
        double r114368 = r114367 * r114367;
        double r114369 = r114366 + r114368;
        double r114370 = sqrt(r114369);
        double r114371 = r114355 * r114370;
        return r114371;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r114372 = phi1;
        double r114373 = -2.504018356542025e+59;
        bool r114374 = r114372 <= r114373;
        double r114375 = 6.956810866249634e+104;
        bool r114376 = r114372 <= r114375;
        double r114377 = !r114376;
        bool r114378 = r114374 || r114377;
        double r114379 = R;
        double r114380 = phi2;
        double r114381 = r114380 - r114372;
        double r114382 = r114379 * r114381;
        double r114383 = lambda1;
        double r114384 = lambda2;
        double r114385 = r114383 - r114384;
        double r114386 = r114385 * r114385;
        double r114387 = r114372 + r114380;
        double r114388 = 2.0;
        double r114389 = r114387 / r114388;
        double r114390 = cos(r114389);
        double r114391 = r114390 * r114390;
        double r114392 = r114386 * r114391;
        double r114393 = r114372 - r114380;
        double r114394 = r114393 * r114393;
        double r114395 = r114392 + r114394;
        double r114396 = sqrt(r114395);
        double r114397 = r114379 * r114396;
        double r114398 = r114378 ? r114382 : r114397;
        return r114398;
}

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