Average Error: 16.3 → 3.7
Time: 37.5s
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 r24417 = phi1;
        double r24418 = sin(r24417);
        double r24419 = phi2;
        double r24420 = sin(r24419);
        double r24421 = r24418 * r24420;
        double r24422 = cos(r24417);
        double r24423 = cos(r24419);
        double r24424 = r24422 * r24423;
        double r24425 = lambda1;
        double r24426 = lambda2;
        double r24427 = r24425 - r24426;
        double r24428 = cos(r24427);
        double r24429 = r24424 * r24428;
        double r24430 = r24421 + r24429;
        double r24431 = acos(r24430);
        double r24432 = R;
        double r24433 = r24431 * r24432;
        return r24433;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r24434 = phi1;
        double r24435 = sin(r24434);
        double r24436 = phi2;
        double r24437 = sin(r24436);
        double r24438 = r24435 * r24437;
        double r24439 = exp(r24438);
        double r24440 = log(r24439);
        double r24441 = cos(r24434);
        double r24442 = cos(r24436);
        double r24443 = r24441 * r24442;
        double r24444 = lambda1;
        double r24445 = cos(r24444);
        double r24446 = lambda2;
        double r24447 = cos(r24446);
        double r24448 = r24445 * r24447;
        double r24449 = sin(r24444);
        double r24450 = sin(r24446);
        double r24451 = r24449 * r24450;
        double r24452 = r24448 + r24451;
        double r24453 = r24443 * r24452;
        double r24454 = r24440 + r24453;
        double r24455 = acos(r24454);
        double r24456 = R;
        double r24457 = r24455 * r24456;
        return r24457;
}

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

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

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

    \[\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 2019325 
(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))