Average Error: 38.9 → 34.1
Time: 14.8s
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 r120122 = R;
        double r120123 = lambda1;
        double r120124 = lambda2;
        double r120125 = r120123 - r120124;
        double r120126 = phi1;
        double r120127 = phi2;
        double r120128 = r120126 + r120127;
        double r120129 = 2.0;
        double r120130 = r120128 / r120129;
        double r120131 = cos(r120130);
        double r120132 = r120125 * r120131;
        double r120133 = r120132 * r120132;
        double r120134 = r120126 - r120127;
        double r120135 = r120134 * r120134;
        double r120136 = r120133 + r120135;
        double r120137 = sqrt(r120136);
        double r120138 = r120122 * r120137;
        return r120138;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r120139 = phi1;
        double r120140 = -2.504018356542025e+59;
        bool r120141 = r120139 <= r120140;
        double r120142 = 6.956810866249634e+104;
        bool r120143 = r120139 <= r120142;
        double r120144 = !r120143;
        bool r120145 = r120141 || r120144;
        double r120146 = R;
        double r120147 = phi2;
        double r120148 = r120147 - r120139;
        double r120149 = r120146 * r120148;
        double r120150 = lambda1;
        double r120151 = lambda2;
        double r120152 = r120150 - r120151;
        double r120153 = r120152 * r120152;
        double r120154 = r120139 + r120147;
        double r120155 = 2.0;
        double r120156 = r120154 / r120155;
        double r120157 = cos(r120156);
        double r120158 = r120157 * r120157;
        double r120159 = r120153 * r120158;
        double r120160 = r120139 - r120147;
        double r120161 = r120160 * r120160;
        double r120162 = r120159 + r120161;
        double r120163 = sqrt(r120162);
        double r120164 = r120146 * r120163;
        double r120165 = r120145 ? r120149 : r120164;
        return r120165;
}

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