Average Error: 17.0 → 3.7
Time: 1.3m
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\]
\[R \cdot e^{\log \left(\frac{\pi}{2} - \sin^{-1} \left(\mathsf{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)\right)}\]
\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
R \cdot e^{\log \left(\frac{\pi}{2} - \sin^{-1} \left(\mathsf{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)\right)}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r1362228 = phi1;
        double r1362229 = sin(r1362228);
        double r1362230 = phi2;
        double r1362231 = sin(r1362230);
        double r1362232 = r1362229 * r1362231;
        double r1362233 = cos(r1362228);
        double r1362234 = cos(r1362230);
        double r1362235 = r1362233 * r1362234;
        double r1362236 = lambda1;
        double r1362237 = lambda2;
        double r1362238 = r1362236 - r1362237;
        double r1362239 = cos(r1362238);
        double r1362240 = r1362235 * r1362239;
        double r1362241 = r1362232 + r1362240;
        double r1362242 = acos(r1362241);
        double r1362243 = R;
        double r1362244 = r1362242 * r1362243;
        return r1362244;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r1362245 = R;
        double r1362246 = atan2(1.0, 0.0);
        double r1362247 = 2.0;
        double r1362248 = r1362246 / r1362247;
        double r1362249 = phi2;
        double r1362250 = cos(r1362249);
        double r1362251 = phi1;
        double r1362252 = cos(r1362251);
        double r1362253 = r1362250 * r1362252;
        double r1362254 = lambda1;
        double r1362255 = cos(r1362254);
        double r1362256 = lambda2;
        double r1362257 = cos(r1362256);
        double r1362258 = sin(r1362254);
        double r1362259 = sin(r1362256);
        double r1362260 = r1362258 * r1362259;
        double r1362261 = fma(r1362255, r1362257, r1362260);
        double r1362262 = sin(r1362249);
        double r1362263 = sin(r1362251);
        double r1362264 = r1362262 * r1362263;
        double r1362265 = fma(r1362253, r1362261, r1362264);
        double r1362266 = asin(r1362265);
        double r1362267 = r1362248 - r1362266;
        double r1362268 = log(r1362267);
        double r1362269 = exp(r1362268);
        double r1362270 = r1362245 * r1362269;
        return r1362270;
}

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 17.0

    \[\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. Using strategy rm
  3. Applied cos-diff3.7

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \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)}\right) \cdot R\]
  4. Applied distribute-lft-in3.7

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

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

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

    \[\leadsto e^{\log \color{blue}{\left(\frac{\pi}{2} - \sin^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_2 \cdot \sin \lambda_1\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)\right)}} \cdot R\]
  10. Final simplification3.7

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

Reproduce

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