Average Error: 16.9 → 4.0
Time: 1.0m
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\]
\[e^{\log \left(\cos^{-1} \left(\mathsf{fma}\left(\mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_2, \cos \phi_1, \sin \phi_1 \cdot \sin \phi_2\right)\right)\right)} \cdot R\]
\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
e^{\log \left(\cos^{-1} \left(\mathsf{fma}\left(\mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_2, \cos \phi_1, \sin \phi_1 \cdot \sin \phi_2\right)\right)\right)} \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r1263216 = phi1;
        double r1263217 = sin(r1263216);
        double r1263218 = phi2;
        double r1263219 = sin(r1263218);
        double r1263220 = r1263217 * r1263219;
        double r1263221 = cos(r1263216);
        double r1263222 = cos(r1263218);
        double r1263223 = r1263221 * r1263222;
        double r1263224 = lambda1;
        double r1263225 = lambda2;
        double r1263226 = r1263224 - r1263225;
        double r1263227 = cos(r1263226);
        double r1263228 = r1263223 * r1263227;
        double r1263229 = r1263220 + r1263228;
        double r1263230 = acos(r1263229);
        double r1263231 = R;
        double r1263232 = r1263230 * r1263231;
        return r1263232;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r1263233 = lambda2;
        double r1263234 = sin(r1263233);
        double r1263235 = lambda1;
        double r1263236 = sin(r1263235);
        double r1263237 = cos(r1263233);
        double r1263238 = cos(r1263235);
        double r1263239 = r1263237 * r1263238;
        double r1263240 = fma(r1263234, r1263236, r1263239);
        double r1263241 = phi2;
        double r1263242 = cos(r1263241);
        double r1263243 = r1263240 * r1263242;
        double r1263244 = phi1;
        double r1263245 = cos(r1263244);
        double r1263246 = sin(r1263244);
        double r1263247 = sin(r1263241);
        double r1263248 = r1263246 * r1263247;
        double r1263249 = fma(r1263243, r1263245, r1263248);
        double r1263250 = acos(r1263249);
        double r1263251 = log(r1263250);
        double r1263252 = exp(r1263251);
        double r1263253 = R;
        double r1263254 = r1263252 * r1263253;
        return r1263254;
}

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.9

    \[\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.9

    \[\leadsto \color{blue}{\cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \cos \left(\lambda_1 - \lambda_2\right), \sin \phi_2 \cdot \sin \phi_1\right)\right) \cdot R}\]
  3. Using strategy rm
  4. Applied cos-diff4.0

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \color{blue}{\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2}, \sin \phi_2 \cdot \sin \phi_1\right)\right) \cdot R\]
  5. Using strategy rm
  6. Applied add-log-exp4.0

    \[\leadsto \color{blue}{\log \left(e^{\cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2, \sin \phi_2 \cdot \sin \phi_1\right)\right)}\right)} \cdot R\]
  7. Simplified4.0

    \[\leadsto \log \color{blue}{\left(e^{\cos^{-1} \left(\mathsf{fma}\left(\mathsf{fma}\left(\sin \lambda_1, \sin \lambda_2, \cos \lambda_2 \cdot \cos \lambda_1\right), \cos \phi_2 \cdot \cos \phi_1, \sin \phi_1 \cdot \sin \phi_2\right)\right)}\right)} \cdot R\]
  8. Using strategy rm
  9. Applied add-exp-log4.0

    \[\leadsto \color{blue}{e^{\log \left(\log \left(e^{\cos^{-1} \left(\mathsf{fma}\left(\mathsf{fma}\left(\sin \lambda_1, \sin \lambda_2, \cos \lambda_2 \cdot \cos \lambda_1\right), \cos \phi_2 \cdot \cos \phi_1, \sin \phi_1 \cdot \sin \phi_2\right)\right)}\right)\right)}} \cdot R\]
  10. Simplified4.0

    \[\leadsto e^{\color{blue}{\log \left(\cos^{-1} \left(\mathsf{fma}\left(\mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_2, \cos \phi_1, \sin \phi_1 \cdot \sin \phi_2\right)\right)\right)}} \cdot R\]
  11. Final simplification4.0

    \[\leadsto e^{\log \left(\cos^{-1} \left(\mathsf{fma}\left(\mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_2, \cos \phi_1, \sin \phi_1 \cdot \sin \phi_2\right)\right)\right)} \cdot R\]

Reproduce

herbie shell --seed 2019200 +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))