Average Error: 39.0 → 0.2
Time: 9.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)}\]
\[\mathsf{hypot}\left(\frac{\mathsf{fma}\left(\lambda_1 - \lambda_2, {\left(\cos \left(0.5 \cdot \phi_2\right)\right)}^{2} \cdot {\left(\cos \left(0.5 \cdot \phi_1\right)\right)}^{2}, \left(\lambda_1 - \lambda_2\right) \cdot \left(\left(-{\left(\sin \left(0.5 \cdot \phi_2\right)\right)}^{2}\right) \cdot {\left(\sin \left(0.5 \cdot \phi_1\right)\right)}^{2}\right)\right)}{\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) + \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)}, \phi_1 - \phi_2\right) \cdot R\]
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)}
\mathsf{hypot}\left(\frac{\mathsf{fma}\left(\lambda_1 - \lambda_2, {\left(\cos \left(0.5 \cdot \phi_2\right)\right)}^{2} \cdot {\left(\cos \left(0.5 \cdot \phi_1\right)\right)}^{2}, \left(\lambda_1 - \lambda_2\right) \cdot \left(\left(-{\left(\sin \left(0.5 \cdot \phi_2\right)\right)}^{2}\right) \cdot {\left(\sin \left(0.5 \cdot \phi_1\right)\right)}^{2}\right)\right)}{\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) + \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)}, \phi_1 - \phi_2\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r99487 = R;
        double r99488 = lambda1;
        double r99489 = lambda2;
        double r99490 = r99488 - r99489;
        double r99491 = phi1;
        double r99492 = phi2;
        double r99493 = r99491 + r99492;
        double r99494 = 2.0;
        double r99495 = r99493 / r99494;
        double r99496 = cos(r99495);
        double r99497 = r99490 * r99496;
        double r99498 = r99497 * r99497;
        double r99499 = r99491 - r99492;
        double r99500 = r99499 * r99499;
        double r99501 = r99498 + r99500;
        double r99502 = sqrt(r99501);
        double r99503 = r99487 * r99502;
        return r99503;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r99504 = lambda1;
        double r99505 = lambda2;
        double r99506 = r99504 - r99505;
        double r99507 = 0.5;
        double r99508 = phi2;
        double r99509 = r99507 * r99508;
        double r99510 = cos(r99509);
        double r99511 = 2.0;
        double r99512 = pow(r99510, r99511);
        double r99513 = phi1;
        double r99514 = r99507 * r99513;
        double r99515 = cos(r99514);
        double r99516 = pow(r99515, r99511);
        double r99517 = r99512 * r99516;
        double r99518 = sin(r99509);
        double r99519 = pow(r99518, r99511);
        double r99520 = -r99519;
        double r99521 = sin(r99514);
        double r99522 = pow(r99521, r99511);
        double r99523 = r99520 * r99522;
        double r99524 = r99506 * r99523;
        double r99525 = fma(r99506, r99517, r99524);
        double r99526 = r99508 * r99507;
        double r99527 = cos(r99526);
        double r99528 = r99513 * r99507;
        double r99529 = cos(r99528);
        double r99530 = r99527 * r99529;
        double r99531 = sin(r99526);
        double r99532 = sin(r99528);
        double r99533 = r99531 * r99532;
        double r99534 = r99530 + r99533;
        double r99535 = r99525 / r99534;
        double r99536 = r99513 - r99508;
        double r99537 = hypot(r99535, r99536);
        double r99538 = R;
        double r99539 = r99537 * r99538;
        return r99539;
}

Error

Bits error versus R

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 39.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. Simplified3.8

    \[\leadsto \color{blue}{\mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right) \cdot R}\]
  3. Taylor expanded around inf 3.8

    \[\leadsto \mathsf{hypot}\left(\color{blue}{\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right) \cdot \lambda_1 - \lambda_2 \cdot \cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right)}, \phi_1 - \phi_2\right) \cdot R\]
  4. Simplified3.8

    \[\leadsto \mathsf{hypot}\left(\color{blue}{\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right) \cdot \left(\lambda_1 - \lambda_2\right)}, \phi_1 - \phi_2\right) \cdot R\]
  5. Using strategy rm
  6. Applied distribute-lft-in3.8

    \[\leadsto \mathsf{hypot}\left(\cos \color{blue}{\left(0.5 \cdot \phi_2 + 0.5 \cdot \phi_1\right)} \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R\]
  7. Applied cos-sum0.1

    \[\leadsto \mathsf{hypot}\left(\color{blue}{\left(\cos \left(0.5 \cdot \phi_2\right) \cdot \cos \left(0.5 \cdot \phi_1\right) - \sin \left(0.5 \cdot \phi_2\right) \cdot \sin \left(0.5 \cdot \phi_1\right)\right)} \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R\]
  8. Simplified0.1

    \[\leadsto \mathsf{hypot}\left(\left(\color{blue}{\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)} - \sin \left(0.5 \cdot \phi_2\right) \cdot \sin \left(0.5 \cdot \phi_1\right)\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R\]
  9. Simplified0.1

    \[\leadsto \mathsf{hypot}\left(\left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) - \color{blue}{\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R\]
  10. Using strategy rm
  11. Applied flip--0.1

    \[\leadsto \mathsf{hypot}\left(\color{blue}{\frac{\left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)\right) \cdot \left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)\right) - \left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right) \cdot \left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)}{\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) + \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)}} \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot R\]
  12. Applied associate-*l/0.2

    \[\leadsto \mathsf{hypot}\left(\color{blue}{\frac{\left(\left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)\right) \cdot \left(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right)\right) - \left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right) \cdot \left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)\right) \cdot \left(\lambda_1 - \lambda_2\right)}{\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) + \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)}}, \phi_1 - \phi_2\right) \cdot R\]
  13. Simplified0.2

    \[\leadsto \mathsf{hypot}\left(\frac{\color{blue}{\mathsf{fma}\left(\lambda_1 - \lambda_2, {\left(\cos \left(0.5 \cdot \phi_2\right)\right)}^{2} \cdot {\left(\cos \left(0.5 \cdot \phi_1\right)\right)}^{2}, \left(\lambda_1 - \lambda_2\right) \cdot \left(\left(-{\left(\sin \left(0.5 \cdot \phi_2\right)\right)}^{2}\right) \cdot {\left(\sin \left(0.5 \cdot \phi_1\right)\right)}^{2}\right)\right)}}{\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) + \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)}, \phi_1 - \phi_2\right) \cdot R\]
  14. Final simplification0.2

    \[\leadsto \mathsf{hypot}\left(\frac{\mathsf{fma}\left(\lambda_1 - \lambda_2, {\left(\cos \left(0.5 \cdot \phi_2\right)\right)}^{2} \cdot {\left(\cos \left(0.5 \cdot \phi_1\right)\right)}^{2}, \left(\lambda_1 - \lambda_2\right) \cdot \left(\left(-{\left(\sin \left(0.5 \cdot \phi_2\right)\right)}^{2}\right) \cdot {\left(\sin \left(0.5 \cdot \phi_1\right)\right)}^{2}\right)\right)}{\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) + \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)}, \phi_1 - \phi_2\right) \cdot R\]

Reproduce

herbie shell --seed 2020024 +o rules:numerics
(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))))))