Average Error: 39.5 → 29.6
Time: 2.8m
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}\;\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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) \le 1.85335802842088590346712744457318896647 \cdot 10^{302}:\\ \;\;\;\;\sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \log \left(e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\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)} \cdot R\\ \mathbf{else}:\\ \;\;\;\;\left(\phi_2 - \phi_1\right) \cdot R\\ \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}\;\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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) \le 1.85335802842088590346712744457318896647 \cdot 10^{302}:\\
\;\;\;\;\sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \log \left(e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\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)} \cdot R\\

\mathbf{else}:\\
\;\;\;\;\left(\phi_2 - \phi_1\right) \cdot R\\

\end{array}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r10396569 = R;
        double r10396570 = lambda1;
        double r10396571 = lambda2;
        double r10396572 = r10396570 - r10396571;
        double r10396573 = phi1;
        double r10396574 = phi2;
        double r10396575 = r10396573 + r10396574;
        double r10396576 = 2.0;
        double r10396577 = r10396575 / r10396576;
        double r10396578 = cos(r10396577);
        double r10396579 = r10396572 * r10396578;
        double r10396580 = r10396579 * r10396579;
        double r10396581 = r10396573 - r10396574;
        double r10396582 = r10396581 * r10396581;
        double r10396583 = r10396580 + r10396582;
        double r10396584 = sqrt(r10396583);
        double r10396585 = r10396569 * r10396584;
        return r10396585;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r10396586 = phi1;
        double r10396587 = phi2;
        double r10396588 = r10396586 - r10396587;
        double r10396589 = r10396588 * r10396588;
        double r10396590 = lambda1;
        double r10396591 = lambda2;
        double r10396592 = r10396590 - r10396591;
        double r10396593 = r10396586 + r10396587;
        double r10396594 = 2.0;
        double r10396595 = r10396593 / r10396594;
        double r10396596 = cos(r10396595);
        double r10396597 = r10396592 * r10396596;
        double r10396598 = r10396597 * r10396597;
        double r10396599 = r10396589 + r10396598;
        double r10396600 = 1.853358028420886e+302;
        bool r10396601 = r10396599 <= r10396600;
        double r10396602 = exp(r10396596);
        double r10396603 = log(r10396602);
        double r10396604 = r10396592 * r10396603;
        double r10396605 = r10396604 * r10396597;
        double r10396606 = r10396605 + r10396589;
        double r10396607 = sqrt(r10396606);
        double r10396608 = R;
        double r10396609 = r10396607 * r10396608;
        double r10396610 = r10396587 - r10396586;
        double r10396611 = r10396610 * r10396608;
        double r10396612 = r10396601 ? r10396609 : r10396611;
        return r10396612;
}

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 (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) < 1.853358028420886e+302

    1. Initial program 2.0

      \[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 add-log-exp2.0

      \[\leadsto 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 \color{blue}{\log \left(e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\right)}\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\]

    if 1.853358028420886e+302 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2)))

    1. Initial program 63.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. Taylor expanded around 0 47.0

      \[\leadsto R \cdot \color{blue}{\left(\phi_2 - \phi_1\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification29.6

    \[\leadsto \begin{array}{l} \mathbf{if}\;\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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) \le 1.85335802842088590346712744457318896647 \cdot 10^{302}:\\ \;\;\;\;\sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \log \left(e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\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)} \cdot R\\ \mathbf{else}:\\ \;\;\;\;\left(\phi_2 - \phi_1\right) \cdot R\\ \end{array}\]

Reproduce

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