\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}{\mathsf{expm1}\left(\mathsf{log1p}\left(\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)\right)\right)}double f(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
double r100077 = lambda1;
double r100078 = theta;
double r100079 = sin(r100078);
double r100080 = delta;
double r100081 = sin(r100080);
double r100082 = r100079 * r100081;
double r100083 = phi1;
double r100084 = cos(r100083);
double r100085 = r100082 * r100084;
double r100086 = cos(r100080);
double r100087 = sin(r100083);
double r100088 = r100087 * r100086;
double r100089 = r100084 * r100081;
double r100090 = cos(r100078);
double r100091 = r100089 * r100090;
double r100092 = r100088 + r100091;
double r100093 = asin(r100092);
double r100094 = sin(r100093);
double r100095 = r100087 * r100094;
double r100096 = r100086 - r100095;
double r100097 = atan2(r100085, r100096);
double r100098 = r100077 + r100097;
return r100098;
}
double f(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
double r100099 = lambda1;
double r100100 = theta;
double r100101 = sin(r100100);
double r100102 = delta;
double r100103 = sin(r100102);
double r100104 = r100101 * r100103;
double r100105 = phi1;
double r100106 = cos(r100105);
double r100107 = r100104 * r100106;
double r100108 = cos(r100102);
double r100109 = sin(r100105);
double r100110 = r100109 * r100108;
double r100111 = r100106 * r100103;
double r100112 = cos(r100100);
double r100113 = r100111 * r100112;
double r100114 = r100110 + r100113;
double r100115 = asin(r100114);
double r100116 = sin(r100115);
double r100117 = r100109 * r100116;
double r100118 = r100108 - r100117;
double r100119 = log1p(r100118);
double r100120 = expm1(r100119);
double r100121 = atan2(r100107, r100120);
double r100122 = r100099 + r100121;
return r100122;
}



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 expm1-log1p-u0.2
Final simplification0.2
herbie shell --seed 2020062 +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))))))))))