Average Error: 16.8 → 3.7
Time: 14.8s
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\]
\[\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \frac{\cos \phi_1 \cdot \left(\cos \phi_2 \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)\right)\right)\right)}{\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \left(-\lambda_2\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
\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \frac{\cos \phi_1 \cdot \left(\cos \phi_2 \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)\right)\right)\right)}{\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)}\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r28330 = phi1;
        double r28331 = sin(r28330);
        double r28332 = phi2;
        double r28333 = sin(r28332);
        double r28334 = r28331 * r28333;
        double r28335 = cos(r28330);
        double r28336 = cos(r28332);
        double r28337 = r28335 * r28336;
        double r28338 = lambda1;
        double r28339 = lambda2;
        double r28340 = r28338 - r28339;
        double r28341 = cos(r28340);
        double r28342 = r28337 * r28341;
        double r28343 = r28334 + r28342;
        double r28344 = acos(r28343);
        double r28345 = R;
        double r28346 = r28344 * r28345;
        return r28346;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r28347 = phi1;
        double r28348 = sin(r28347);
        double r28349 = phi2;
        double r28350 = sin(r28349);
        double r28351 = r28348 * r28350;
        double r28352 = cos(r28347);
        double r28353 = cos(r28349);
        double r28354 = lambda1;
        double r28355 = cos(r28354);
        double r28356 = lambda2;
        double r28357 = cos(r28356);
        double r28358 = sin(r28354);
        double r28359 = -r28356;
        double r28360 = sin(r28359);
        double r28361 = r28358 * r28360;
        double r28362 = fma(r28355, r28357, r28361);
        double r28363 = r28355 * r28357;
        double r28364 = r28363 - r28361;
        double r28365 = r28362 * r28364;
        double r28366 = expm1(r28365);
        double r28367 = log1p(r28366);
        double r28368 = r28353 * r28367;
        double r28369 = r28352 * r28368;
        double r28370 = r28363 + r28361;
        double r28371 = r28369 / r28370;
        double r28372 = r28351 + r28371;
        double r28373 = acos(r28372);
        double r28374 = R;
        double r28375 = r28373 * r28374;
        return r28375;
}

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

    \[\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 sub-neg16.8

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \color{blue}{\left(\lambda_1 + \left(-\lambda_2\right)\right)}\right) \cdot R\]
  4. Applied cos-sum3.6

    \[\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 \left(-\lambda_2\right) - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)}\right) \cdot R\]
  5. Simplified3.6

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

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \color{blue}{\frac{\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right) - \left(\sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \left(\sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)}{\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)}}\right) \cdot R\]
  8. Applied associate-*r/3.7

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

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \frac{\color{blue}{\cos \phi_1 \cdot \left(\cos \phi_2 \cdot \left(\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)\right)\right)}}{\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)}\right) \cdot R\]
  10. Using strategy rm
  11. Applied log1p-expm1-u3.7

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \frac{\cos \phi_1 \cdot \left(\cos \phi_2 \cdot \color{blue}{\mathsf{log1p}\left(\mathsf{expm1}\left(\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)\right)\right)}\right)}{\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)}\right) \cdot R\]
  12. Final simplification3.7

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

Reproduce

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