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{{\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 \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r60096 = R;
double r60097 = 2.0;
double r60098 = phi1;
double r60099 = phi2;
double r60100 = r60098 - r60099;
double r60101 = r60100 / r60097;
double r60102 = sin(r60101);
double r60103 = pow(r60102, r60097);
double r60104 = cos(r60098);
double r60105 = cos(r60099);
double r60106 = r60104 * r60105;
double r60107 = lambda1;
double r60108 = lambda2;
double r60109 = r60107 - r60108;
double r60110 = r60109 / r60097;
double r60111 = sin(r60110);
double r60112 = r60106 * r60111;
double r60113 = r60112 * r60111;
double r60114 = r60103 + r60113;
double r60115 = sqrt(r60114);
double r60116 = 1.0;
double r60117 = r60116 - r60114;
double r60118 = sqrt(r60117);
double r60119 = atan2(r60115, r60118);
double r60120 = r60097 * r60119;
double r60121 = r60096 * r60120;
return r60121;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r60122 = R;
double r60123 = 2.0;
double r60124 = phi1;
double r60125 = phi2;
double r60126 = r60124 - r60125;
double r60127 = r60126 / r60123;
double r60128 = sin(r60127);
double r60129 = pow(r60128, r60123);
double r60130 = cos(r60124);
double r60131 = cos(r60125);
double r60132 = r60130 * r60131;
double r60133 = lambda1;
double r60134 = lambda2;
double r60135 = r60133 - r60134;
double r60136 = r60135 / r60123;
double r60137 = sin(r60136);
double r60138 = r60132 * r60137;
double r60139 = expm1(r60137);
double r60140 = log1p(r60139);
double r60141 = r60138 * r60140;
double r60142 = r60129 + r60141;
double r60143 = sqrt(r60142);
double r60144 = 1.0;
double r60145 = r60138 * r60137;
double r60146 = r60129 + r60145;
double r60147 = r60144 - r60146;
double r60148 = sqrt(r60147);
double r60149 = atan2(r60143, r60148);
double r60150 = r60123 * r60149;
double r60151 = r60122 * r60150;
return r60151;
}



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 log1p-expm1-u24.6
Final simplification24.6
herbie shell --seed 2020043 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
:precision binary64
(* 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))))))))))