Average Error: 16.9 → 3.9
Time: 13.9s
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(\log \left(e^{\sin \phi_1 \cdot \sin \phi_2}\right) + \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)\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(\log \left(e^{\sin \phi_1 \cdot \sin \phi_2}\right) + \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)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r23362 = phi1;
        double r23363 = sin(r23362);
        double r23364 = phi2;
        double r23365 = sin(r23364);
        double r23366 = r23363 * r23365;
        double r23367 = cos(r23362);
        double r23368 = cos(r23364);
        double r23369 = r23367 * r23368;
        double r23370 = lambda1;
        double r23371 = lambda2;
        double r23372 = r23370 - r23371;
        double r23373 = cos(r23372);
        double r23374 = r23369 * r23373;
        double r23375 = r23366 + r23374;
        double r23376 = acos(r23375);
        double r23377 = R;
        double r23378 = r23376 * r23377;
        return r23378;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r23379 = phi1;
        double r23380 = sin(r23379);
        double r23381 = phi2;
        double r23382 = sin(r23381);
        double r23383 = r23380 * r23382;
        double r23384 = exp(r23383);
        double r23385 = log(r23384);
        double r23386 = cos(r23379);
        double r23387 = cos(r23381);
        double r23388 = r23386 * r23387;
        double r23389 = lambda1;
        double r23390 = cos(r23389);
        double r23391 = lambda2;
        double r23392 = cos(r23391);
        double r23393 = r23390 * r23392;
        double r23394 = sin(r23389);
        double r23395 = sin(r23391);
        double r23396 = r23394 * r23395;
        double r23397 = r23393 + r23396;
        double r23398 = r23388 * r23397;
        double r23399 = r23385 + r23398;
        double r23400 = acos(r23399);
        double r23401 = R;
        double r23402 = r23400 * r23401;
        return r23402;
}

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

    \[\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. Using strategy rm
  5. Applied add-log-exp3.9

    \[\leadsto \cos^{-1} \left(\color{blue}{\log \left(e^{\sin \phi_1 \cdot \sin \phi_2}\right)} + \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)\right) \cdot R\]
  6. Final simplification3.9

    \[\leadsto \cos^{-1} \left(\log \left(e^{\sin \phi_1 \cdot \sin \phi_2}\right) + \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)\right) \cdot R\]

Reproduce

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