Average Error: 16.9 → 3.9
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\]
\[\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 + \log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\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
\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 + \log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r27772 = phi1;
        double r27773 = sin(r27772);
        double r27774 = phi2;
        double r27775 = sin(r27774);
        double r27776 = r27773 * r27775;
        double r27777 = cos(r27772);
        double r27778 = cos(r27774);
        double r27779 = r27777 * r27778;
        double r27780 = lambda1;
        double r27781 = lambda2;
        double r27782 = r27780 - r27781;
        double r27783 = cos(r27782);
        double r27784 = r27779 * r27783;
        double r27785 = r27776 + r27784;
        double r27786 = acos(r27785);
        double r27787 = R;
        double r27788 = r27786 * r27787;
        return r27788;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r27789 = phi1;
        double r27790 = sin(r27789);
        double r27791 = phi2;
        double r27792 = sin(r27791);
        double r27793 = r27790 * r27792;
        double r27794 = exp(r27793);
        double r27795 = log(r27794);
        double r27796 = cos(r27789);
        double r27797 = cos(r27791);
        double r27798 = r27796 * r27797;
        double r27799 = lambda1;
        double r27800 = cos(r27799);
        double r27801 = lambda2;
        double r27802 = cos(r27801);
        double r27803 = r27800 * r27802;
        double r27804 = sin(r27799);
        double r27805 = sin(r27801);
        double r27806 = r27804 * r27805;
        double r27807 = exp(r27806);
        double r27808 = log(r27807);
        double r27809 = r27803 + r27808;
        double r27810 = r27798 * r27809;
        double r27811 = r27795 + r27810;
        double r27812 = acos(r27811);
        double r27813 = R;
        double r27814 = r27812 * r27813;
        return r27814;
}

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(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \color{blue}{\log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)}\right)\right) \cdot R\]
  6. Using strategy rm
  7. 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 + \log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)\right)\right) \cdot R\]
  8. 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 + \log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)\right)\right) \cdot R\]

Reproduce

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