\lambda_1 + \tan^{-1}_* \frac{\left(\sin theta \cdot \sin delta\right) \cdot \cos \phi_1}{\cos delta - \sin \phi_1 \cdot \sin \left(\sin^{-1} \left(\sin \phi_1 \cdot \cos delta + \left(\cos \phi_1 \cdot \sin delta\right) \cdot \cos theta\right)\right)}\lambda_1 + \tan^{-1}_* \frac{\left(\sin theta \cdot \sin delta\right) \cdot \cos \phi_1}{\log \left(e^{\cos delta - \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \phi_1 \cdot \sin \left(\sin^{-1} \left(\sin \phi_1 \cdot \cos delta + \left(\cos \phi_1 \cdot \sin delta\right) \cdot \cos theta\right)\right)\right)\right)}\right)}double f(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
double r99986 = lambda1;
double r99987 = theta;
double r99988 = sin(r99987);
double r99989 = delta;
double r99990 = sin(r99989);
double r99991 = r99988 * r99990;
double r99992 = phi1;
double r99993 = cos(r99992);
double r99994 = r99991 * r99993;
double r99995 = cos(r99989);
double r99996 = sin(r99992);
double r99997 = r99996 * r99995;
double r99998 = r99993 * r99990;
double r99999 = cos(r99987);
double r100000 = r99998 * r99999;
double r100001 = r99997 + r100000;
double r100002 = asin(r100001);
double r100003 = sin(r100002);
double r100004 = r99996 * r100003;
double r100005 = r99995 - r100004;
double r100006 = atan2(r99994, r100005);
double r100007 = r99986 + r100006;
return r100007;
}
double f(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
double r100008 = lambda1;
double r100009 = theta;
double r100010 = sin(r100009);
double r100011 = delta;
double r100012 = sin(r100011);
double r100013 = r100010 * r100012;
double r100014 = phi1;
double r100015 = cos(r100014);
double r100016 = r100013 * r100015;
double r100017 = cos(r100011);
double r100018 = sin(r100014);
double r100019 = r100018 * r100017;
double r100020 = r100015 * r100012;
double r100021 = cos(r100009);
double r100022 = r100020 * r100021;
double r100023 = r100019 + r100022;
double r100024 = asin(r100023);
double r100025 = sin(r100024);
double r100026 = r100018 * r100025;
double r100027 = expm1(r100026);
double r100028 = log1p(r100027);
double r100029 = r100017 - r100028;
double r100030 = exp(r100029);
double r100031 = log(r100030);
double r100032 = atan2(r100016, r100031);
double r100033 = r100008 + r100032;
return r100033;
}



Bits error versus lambda1



Bits error versus phi1



Bits error versus phi2



Bits error versus delta



Bits error versus theta
Results
Initial program 0.2
rmApplied add-log-exp0.2
Applied add-log-exp0.2
Applied diff-log0.2
Simplified0.2
rmApplied log1p-expm1-u0.2
Final simplification0.2
herbie shell --seed 2020065 +o rules:numerics
(FPCore (lambda1 phi1 phi2 delta theta)
:name "Destination given bearing on a great circle"
:precision binary64
(+ lambda1 (atan2 (* (* (sin theta) (sin delta)) (cos phi1)) (- (cos delta) (* (sin phi1) (sin (asin (+ (* (sin phi1) (cos delta)) (* (* (cos phi1) (sin delta)) (cos theta))))))))))