\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(\mathsf{expm1}\left(\mathsf{log1p}\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 Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r20822 = phi1;
double r20823 = sin(r20822);
double r20824 = phi2;
double r20825 = sin(r20824);
double r20826 = r20823 * r20825;
double r20827 = cos(r20822);
double r20828 = cos(r20824);
double r20829 = r20827 * r20828;
double r20830 = lambda1;
double r20831 = lambda2;
double r20832 = r20830 - r20831;
double r20833 = cos(r20832);
double r20834 = r20829 * r20833;
double r20835 = r20826 + r20834;
double r20836 = acos(r20835);
double r20837 = R;
double r20838 = r20836 * r20837;
return r20838;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r20839 = phi1;
double r20840 = sin(r20839);
double r20841 = phi2;
double r20842 = sin(r20841);
double r20843 = r20840 * r20842;
double r20844 = log1p(r20843);
double r20845 = expm1(r20844);
double r20846 = cos(r20839);
double r20847 = cos(r20841);
double r20848 = r20846 * r20847;
double r20849 = lambda1;
double r20850 = cos(r20849);
double r20851 = lambda2;
double r20852 = cos(r20851);
double r20853 = r20850 * r20852;
double r20854 = sin(r20849);
double r20855 = sin(r20851);
double r20856 = r20854 * r20855;
double r20857 = r20853 + r20856;
double r20858 = r20848 * r20857;
double r20859 = r20845 + r20858;
double r20860 = acos(r20859);
double r20861 = R;
double r20862 = r20860 * r20861;
return r20862;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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