\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 \lambda_2\right)\right)\right)\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r23581 = phi1;
double r23582 = sin(r23581);
double r23583 = phi2;
double r23584 = sin(r23583);
double r23585 = r23582 * r23584;
double r23586 = cos(r23581);
double r23587 = cos(r23583);
double r23588 = r23586 * r23587;
double r23589 = lambda1;
double r23590 = lambda2;
double r23591 = r23589 - r23590;
double r23592 = cos(r23591);
double r23593 = r23588 * r23592;
double r23594 = r23585 + r23593;
double r23595 = acos(r23594);
double r23596 = R;
double r23597 = r23595 * r23596;
return r23597;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r23598 = phi1;
double r23599 = sin(r23598);
double r23600 = phi2;
double r23601 = sin(r23600);
double r23602 = r23599 * r23601;
double r23603 = cos(r23598);
double r23604 = cos(r23600);
double r23605 = r23603 * r23604;
double r23606 = lambda1;
double r23607 = cos(r23606);
double r23608 = lambda2;
double r23609 = cos(r23608);
double r23610 = r23607 * r23609;
double r23611 = sin(r23606);
double r23612 = sin(r23608);
double r23613 = r23611 * r23612;
double r23614 = expm1(r23613);
double r23615 = log1p(r23614);
double r23616 = r23610 + r23615;
double r23617 = r23605 * r23616;
double r23618 = r23602 + r23617;
double r23619 = acos(r23618);
double r23620 = R;
double r23621 = r23619 * r23620;
return r23621;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 17.2
rmApplied cos-diff3.9
rmApplied log1p-expm1-u3.9
Final simplification3.9
herbie shell --seed 2020039 +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))