\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\log \left(e^{\cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right), \sin \phi_1 \cdot \sin \phi_2\right)\right)}\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r20791 = phi1;
double r20792 = sin(r20791);
double r20793 = phi2;
double r20794 = sin(r20793);
double r20795 = r20792 * r20794;
double r20796 = cos(r20791);
double r20797 = cos(r20793);
double r20798 = r20796 * r20797;
double r20799 = lambda1;
double r20800 = lambda2;
double r20801 = r20799 - r20800;
double r20802 = cos(r20801);
double r20803 = r20798 * r20802;
double r20804 = r20795 + r20803;
double r20805 = acos(r20804);
double r20806 = R;
double r20807 = r20805 * r20806;
return r20807;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r20808 = phi1;
double r20809 = cos(r20808);
double r20810 = phi2;
double r20811 = cos(r20810);
double r20812 = r20809 * r20811;
double r20813 = lambda2;
double r20814 = cos(r20813);
double r20815 = lambda1;
double r20816 = cos(r20815);
double r20817 = sin(r20815);
double r20818 = sin(r20813);
double r20819 = r20817 * r20818;
double r20820 = fma(r20814, r20816, r20819);
double r20821 = sin(r20808);
double r20822 = sin(r20810);
double r20823 = r20821 * r20822;
double r20824 = fma(r20812, r20820, r20823);
double r20825 = acos(r20824);
double r20826 = exp(r20825);
double r20827 = log(r20826);
double r20828 = R;
double r20829 = r20827 * r20828;
return r20829;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 16.6
rmApplied cos-diff3.8
Applied distribute-lft-in3.8
rmApplied add-log-exp3.8
Simplified3.8
Final simplification3.8
herbie shell --seed 2019212 +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))