Average Error: 16.8 → 3.6
Time: 15.2s
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\]
\[\left(\frac{\pi}{2} - \left(\frac{\pi}{2} - \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) + \mathsf{expm1}\left(\mathsf{log1p}\left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)\right)\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
\left(\frac{\pi}{2} - \left(\frac{\pi}{2} - \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) + \mathsf{expm1}\left(\mathsf{log1p}\left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)\right)\right)\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r29290 = phi1;
        double r29291 = sin(r29290);
        double r29292 = phi2;
        double r29293 = sin(r29292);
        double r29294 = r29291 * r29293;
        double r29295 = cos(r29290);
        double r29296 = cos(r29292);
        double r29297 = r29295 * r29296;
        double r29298 = lambda1;
        double r29299 = lambda2;
        double r29300 = r29298 - r29299;
        double r29301 = cos(r29300);
        double r29302 = r29297 * r29301;
        double r29303 = r29294 + r29302;
        double r29304 = acos(r29303);
        double r29305 = R;
        double r29306 = r29304 * r29305;
        return r29306;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r29307 = atan2(1.0, 0.0);
        double r29308 = 2.0;
        double r29309 = r29307 / r29308;
        double r29310 = phi1;
        double r29311 = sin(r29310);
        double r29312 = phi2;
        double r29313 = sin(r29312);
        double r29314 = r29311 * r29313;
        double r29315 = cos(r29310);
        double r29316 = cos(r29312);
        double r29317 = r29315 * r29316;
        double r29318 = lambda1;
        double r29319 = cos(r29318);
        double r29320 = lambda2;
        double r29321 = cos(r29320);
        double r29322 = r29319 * r29321;
        double r29323 = r29317 * r29322;
        double r29324 = sin(r29318);
        double r29325 = sin(r29320);
        double r29326 = r29324 * r29325;
        double r29327 = r29317 * r29326;
        double r29328 = log1p(r29327);
        double r29329 = expm1(r29328);
        double r29330 = r29323 + r29329;
        double r29331 = r29314 + r29330;
        double r29332 = acos(r29331);
        double r29333 = r29309 - r29332;
        double r29334 = r29309 - r29333;
        double r29335 = R;
        double r29336 = r29334 * r29335;
        return r29336;
}

Error

Bits error versus R

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

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 cos-diff3.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 \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)}\right) \cdot R\]
  4. Applied distribute-lft-in3.6

    \[\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 expm1-log1p-u3.6

    \[\leadsto \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) + \color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}\right)\right) \cdot R\]
  7. Using strategy rm
  8. Applied acos-asin3.7

    \[\leadsto \color{blue}{\left(\frac{\pi}{2} - \sin^{-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) + \mathsf{expm1}\left(\mathsf{log1p}\left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)\right)\right)\right)} \cdot R\]
  9. Using strategy rm
  10. Applied asin-acos3.6

    \[\leadsto \left(\frac{\pi}{2} - \color{blue}{\left(\frac{\pi}{2} - \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) + \mathsf{expm1}\left(\mathsf{log1p}\left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)\right)\right)\right)}\right) \cdot R\]
  11. Final simplification3.6

    \[\leadsto \left(\frac{\pi}{2} - \left(\frac{\pi}{2} - \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) + \mathsf{expm1}\left(\mathsf{log1p}\left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)\right)\right)\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))