Average Error: 16.7 → 3.8
Time: 41.4s
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(\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) + \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \phi_2 \cdot \sin \phi_1\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(\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) + \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \phi_2 \cdot \sin \phi_1\right)\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r359181 = phi1;
        double r359182 = sin(r359181);
        double r359183 = phi2;
        double r359184 = sin(r359183);
        double r359185 = r359182 * r359184;
        double r359186 = cos(r359181);
        double r359187 = cos(r359183);
        double r359188 = r359186 * r359187;
        double r359189 = lambda1;
        double r359190 = lambda2;
        double r359191 = r359189 - r359190;
        double r359192 = cos(r359191);
        double r359193 = r359188 * r359192;
        double r359194 = r359185 + r359193;
        double r359195 = acos(r359194);
        double r359196 = R;
        double r359197 = r359195 * r359196;
        return r359197;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r359198 = phi1;
        double r359199 = cos(r359198);
        double r359200 = phi2;
        double r359201 = cos(r359200);
        double r359202 = r359199 * r359201;
        double r359203 = lambda1;
        double r359204 = cos(r359203);
        double r359205 = lambda2;
        double r359206 = cos(r359205);
        double r359207 = r359204 * r359206;
        double r359208 = sin(r359203);
        double r359209 = sin(r359205);
        double r359210 = r359208 * r359209;
        double r359211 = r359207 + r359210;
        double r359212 = r359202 * r359211;
        double r359213 = sin(r359200);
        double r359214 = sin(r359198);
        double r359215 = r359213 * r359214;
        double r359216 = expm1(r359215);
        double r359217 = log1p(r359216);
        double r359218 = r359212 + r359217;
        double r359219 = acos(r359218);
        double r359220 = R;
        double r359221 = r359219 * r359220;
        return r359221;
}

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

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

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

    \[\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. Using strategy rm
  7. Applied log1p-expm1-u3.8

    \[\leadsto \cos^{-1} \left(\color{blue}{\mathsf{log1p}\left(\mathsf{expm1}\left(\log \left(e^{\sin \phi_1 \cdot \sin \phi_2}\right)\right)\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\]
  8. Simplified3.8

    \[\leadsto \cos^{-1} \left(\mathsf{log1p}\left(\color{blue}{\mathsf{expm1}\left(\sin \phi_1 \cdot \sin \phi_2\right)}\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\]
  9. Final simplification3.8

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

Reproduce

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