Average Error: 38.9 → 34.1
Time: 10.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 r82445 = R;
        double r82446 = lambda1;
        double r82447 = lambda2;
        double r82448 = r82446 - r82447;
        double r82449 = phi1;
        double r82450 = phi2;
        double r82451 = r82449 + r82450;
        double r82452 = 2.0;
        double r82453 = r82451 / r82452;
        double r82454 = cos(r82453);
        double r82455 = r82448 * r82454;
        double r82456 = r82455 * r82455;
        double r82457 = r82449 - r82450;
        double r82458 = r82457 * r82457;
        double r82459 = r82456 + r82458;
        double r82460 = sqrt(r82459);
        double r82461 = r82445 * r82460;
        return r82461;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r82462 = phi1;
        double r82463 = -2.504018356542025e+59;
        bool r82464 = r82462 <= r82463;
        double r82465 = 6.956810866249634e+104;
        bool r82466 = r82462 <= r82465;
        double r82467 = !r82466;
        bool r82468 = r82464 || r82467;
        double r82469 = R;
        double r82470 = phi2;
        double r82471 = r82470 - r82462;
        double r82472 = r82469 * r82471;
        double r82473 = lambda1;
        double r82474 = lambda2;
        double r82475 = r82473 - r82474;
        double r82476 = r82475 * r82475;
        double r82477 = r82462 + r82470;
        double r82478 = 2.0;
        double r82479 = r82477 / r82478;
        double r82480 = cos(r82479);
        double r82481 = r82480 * r82480;
        double r82482 = r82476 * r82481;
        double r82483 = r82462 - r82470;
        double r82484 = r82483 * r82483;
        double r82485 = r82482 + r82484;
        double r82486 = sqrt(r82485);
        double r82487 = r82469 * r82486;
        double r82488 = r82468 ? r82472 : r82487;
        return r82488;
}

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