R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}}}{\sqrt{1 - \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2684038 = R;
double r2684039 = 2.0;
double r2684040 = phi1;
double r2684041 = phi2;
double r2684042 = r2684040 - r2684041;
double r2684043 = r2684042 / r2684039;
double r2684044 = sin(r2684043);
double r2684045 = pow(r2684044, r2684039);
double r2684046 = cos(r2684040);
double r2684047 = cos(r2684041);
double r2684048 = r2684046 * r2684047;
double r2684049 = lambda1;
double r2684050 = lambda2;
double r2684051 = r2684049 - r2684050;
double r2684052 = r2684051 / r2684039;
double r2684053 = sin(r2684052);
double r2684054 = r2684048 * r2684053;
double r2684055 = r2684054 * r2684053;
double r2684056 = r2684045 + r2684055;
double r2684057 = sqrt(r2684056);
double r2684058 = 1.0;
double r2684059 = r2684058 - r2684056;
double r2684060 = sqrt(r2684059);
double r2684061 = atan2(r2684057, r2684060);
double r2684062 = r2684039 * r2684061;
double r2684063 = r2684038 * r2684062;
return r2684063;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2684064 = R;
double r2684065 = 2.0;
double r2684066 = lambda1;
double r2684067 = lambda2;
double r2684068 = r2684066 - r2684067;
double r2684069 = r2684068 / r2684065;
double r2684070 = sin(r2684069);
double r2684071 = phi2;
double r2684072 = cos(r2684071);
double r2684073 = phi1;
double r2684074 = cos(r2684073);
double r2684075 = r2684072 * r2684074;
double r2684076 = r2684075 * r2684070;
double r2684077 = r2684070 * r2684076;
double r2684078 = r2684073 - r2684071;
double r2684079 = r2684078 / r2684065;
double r2684080 = sin(r2684079);
double r2684081 = pow(r2684080, r2684065);
double r2684082 = r2684077 + r2684081;
double r2684083 = sqrt(r2684082);
double r2684084 = 1.0;
double r2684085 = log1p(r2684070);
double r2684086 = expm1(r2684085);
double r2684087 = r2684086 * r2684076;
double r2684088 = r2684087 + r2684081;
double r2684089 = r2684084 - r2684088;
double r2684090 = sqrt(r2684089);
double r2684091 = atan2(r2684083, r2684090);
double r2684092 = r2684065 * r2684091;
double r2684093 = r2684064 * r2684092;
return r2684093;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied expm1-log1p-u24.6
Final simplification24.6
herbie shell --seed 2019165 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))) (sqrt (- 1 (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))))))))