Average Error: 16.7 → 3.8
Time: 1.1m
Precision: 64
\[\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R\]
\[\log \left(e^{\cos^{-1} \left((\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2 + \cos \lambda_2 \cdot \cos \lambda_1\right) + \left(\sin \phi_2 \cdot \sin \phi_1\right))_*\right)}\right) \cdot R\]
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r1377547 = phi1;
        double r1377548 = sin(r1377547);
        double r1377549 = phi2;
        double r1377550 = sin(r1377549);
        double r1377551 = r1377548 * r1377550;
        double r1377552 = cos(r1377547);
        double r1377553 = cos(r1377549);
        double r1377554 = r1377552 * r1377553;
        double r1377555 = lambda1;
        double r1377556 = lambda2;
        double r1377557 = r1377555 - r1377556;
        double r1377558 = cos(r1377557);
        double r1377559 = r1377554 * r1377558;
        double r1377560 = r1377551 + r1377559;
        double r1377561 = acos(r1377560);
        double r1377562 = R;
        double r1377563 = r1377561 * r1377562;
        return r1377563;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r1377564 = phi2;
        double r1377565 = cos(r1377564);
        double r1377566 = phi1;
        double r1377567 = cos(r1377566);
        double r1377568 = r1377565 * r1377567;
        double r1377569 = lambda1;
        double r1377570 = sin(r1377569);
        double r1377571 = lambda2;
        double r1377572 = sin(r1377571);
        double r1377573 = r1377570 * r1377572;
        double r1377574 = cos(r1377571);
        double r1377575 = cos(r1377569);
        double r1377576 = r1377574 * r1377575;
        double r1377577 = r1377573 + r1377576;
        double r1377578 = sin(r1377564);
        double r1377579 = sin(r1377566);
        double r1377580 = r1377578 * r1377579;
        double r1377581 = fma(r1377568, r1377577, r1377580);
        double r1377582 = acos(r1377581);
        double r1377583 = exp(r1377582);
        double r1377584 = log(r1377583);
        double r1377585 = R;
        double r1377586 = r1377584 * r1377585;
        return r1377586;
}

\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R
\log \left(e^{\cos^{-1} \left((\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2 + \cos \lambda_2 \cdot \cos \lambda_1\right) + \left(\sin \phi_2 \cdot \sin \phi_1\right))_*\right)}\right) \cdot R

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 16.7

    \[\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R\]
  2. Simplified16.7

    \[\leadsto \color{blue}{R \cdot \cos^{-1} \left((\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \left(\lambda_1 - \lambda_2\right)\right) + \left(\sin \phi_2 \cdot \sin \phi_1\right))_*\right)}\]
  3. Using strategy rm
  4. Applied cos-diff3.8

    \[\leadsto R \cdot \cos^{-1} \left((\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \color{blue}{\left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)} + \left(\sin \phi_2 \cdot \sin \phi_1\right))_*\right)\]
  5. Using strategy rm
  6. Applied add-log-exp3.8

    \[\leadsto R \cdot \color{blue}{\log \left(e^{\cos^{-1} \left((\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right) + \left(\sin \phi_2 \cdot \sin \phi_1\right))_*\right)}\right)}\]
  7. Final simplification3.8

    \[\leadsto \log \left(e^{\cos^{-1} \left((\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2 + \cos \lambda_2 \cdot \cos \lambda_1\right) + \left(\sin \phi_2 \cdot \sin \phi_1\right))_*\right)}\right) \cdot R\]

Reproduce

herbie shell --seed 2019101 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
  :name "Spherical law of cosines"
  (* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R))