Average Error: 17.0 → 4.0
Time: 55.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\]
\[R \cdot \cos^{-1} \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\mathsf{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_1 \cdot \cos \lambda_2\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)\right)\right)\]
\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
R \cdot \cos^{-1} \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\mathsf{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_1 \cdot \cos \lambda_2\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)\right)\right)
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r960158 = phi1;
        double r960159 = sin(r960158);
        double r960160 = phi2;
        double r960161 = sin(r960160);
        double r960162 = r960159 * r960161;
        double r960163 = cos(r960158);
        double r960164 = cos(r960160);
        double r960165 = r960163 * r960164;
        double r960166 = lambda1;
        double r960167 = lambda2;
        double r960168 = r960166 - r960167;
        double r960169 = cos(r960168);
        double r960170 = r960165 * r960169;
        double r960171 = r960162 + r960170;
        double r960172 = acos(r960171);
        double r960173 = R;
        double r960174 = r960172 * r960173;
        return r960174;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r960175 = R;
        double r960176 = phi2;
        double r960177 = cos(r960176);
        double r960178 = phi1;
        double r960179 = cos(r960178);
        double r960180 = r960177 * r960179;
        double r960181 = lambda2;
        double r960182 = sin(r960181);
        double r960183 = lambda1;
        double r960184 = sin(r960183);
        double r960185 = cos(r960183);
        double r960186 = cos(r960181);
        double r960187 = r960185 * r960186;
        double r960188 = fma(r960182, r960184, r960187);
        double r960189 = sin(r960176);
        double r960190 = sin(r960178);
        double r960191 = r960189 * r960190;
        double r960192 = fma(r960180, r960188, r960191);
        double r960193 = log1p(r960192);
        double r960194 = expm1(r960193);
        double r960195 = acos(r960194);
        double r960196 = r960175 * r960195;
        return r960196;
}

Error

Bits error versus R

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 17.0

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

    \[\leadsto \color{blue}{R \cdot \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \cos \left(\lambda_1 - \lambda_2\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)}\]
  3. Using strategy rm
  4. Applied cos-diff3.9

    \[\leadsto R \cdot \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \color{blue}{\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2}, \sin \phi_2 \cdot \sin \phi_1\right)\right)\]
  5. Using strategy rm
  6. Applied expm1-log1p-u4.0

    \[\leadsto R \cdot \cos^{-1} \color{blue}{\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2, \sin \phi_2 \cdot \sin \phi_1\right)\right)\right)\right)}\]
  7. Simplified4.0

    \[\leadsto R \cdot \cos^{-1} \left(\mathsf{expm1}\left(\color{blue}{\mathsf{log1p}\left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_1 \cdot \cos \lambda_2\right), \sin \phi_1 \cdot \sin \phi_2\right)\right)}\right)\right)\]
  8. Final simplification4.0

    \[\leadsto R \cdot \cos^{-1} \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\mathsf{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_1 \cdot \cos \lambda_2\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)\right)\right)\]

Reproduce

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