Average Error: 16.5 → 3.9
Time: 13.6s
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(\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 - \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \lambda_1 \cdot \sin \left(-\lambda_2\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
\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 - \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)\right)\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r26106 = phi1;
        double r26107 = sin(r26106);
        double r26108 = phi2;
        double r26109 = sin(r26108);
        double r26110 = r26107 * r26109;
        double r26111 = cos(r26106);
        double r26112 = cos(r26108);
        double r26113 = r26111 * r26112;
        double r26114 = lambda1;
        double r26115 = lambda2;
        double r26116 = r26114 - r26115;
        double r26117 = cos(r26116);
        double r26118 = r26113 * r26117;
        double r26119 = r26110 + r26118;
        double r26120 = acos(r26119);
        double r26121 = R;
        double r26122 = r26120 * r26121;
        return r26122;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r26123 = phi1;
        double r26124 = sin(r26123);
        double r26125 = phi2;
        double r26126 = sin(r26125);
        double r26127 = r26124 * r26126;
        double r26128 = cos(r26123);
        double r26129 = cos(r26125);
        double r26130 = r26128 * r26129;
        double r26131 = lambda1;
        double r26132 = cos(r26131);
        double r26133 = lambda2;
        double r26134 = cos(r26133);
        double r26135 = r26132 * r26134;
        double r26136 = sin(r26131);
        double r26137 = -r26133;
        double r26138 = sin(r26137);
        double r26139 = r26136 * r26138;
        double r26140 = expm1(r26139);
        double r26141 = log1p(r26140);
        double r26142 = r26135 - r26141;
        double r26143 = r26130 * r26142;
        double r26144 = r26127 + r26143;
        double r26145 = acos(r26144);
        double r26146 = R;
        double r26147 = r26145 * r26146;
        return r26147;
}

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

    \[\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 sub-neg16.5

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \color{blue}{\left(\lambda_1 + \left(-\lambda_2\right)\right)}\right) \cdot R\]
  4. Applied cos-sum3.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 \left(-\lambda_2\right) - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)}\right) \cdot R\]
  5. Simplified3.9

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

Reproduce

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