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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \left(\frac{\lambda_1}{2}\right) \cdot \cos \left(\frac{\lambda_2}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right) \cdot \left(\sin \left(\frac{\lambda_1}{2}\right) \cdot \cos \left(\frac{\lambda_2}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r117166 = R;
double r117167 = 2.0;
double r117168 = phi1;
double r117169 = phi2;
double r117170 = r117168 - r117169;
double r117171 = r117170 / r117167;
double r117172 = sin(r117171);
double r117173 = pow(r117172, r117167);
double r117174 = cos(r117168);
double r117175 = cos(r117169);
double r117176 = r117174 * r117175;
double r117177 = lambda1;
double r117178 = lambda2;
double r117179 = r117177 - r117178;
double r117180 = r117179 / r117167;
double r117181 = sin(r117180);
double r117182 = r117176 * r117181;
double r117183 = r117182 * r117181;
double r117184 = r117173 + r117183;
double r117185 = sqrt(r117184);
double r117186 = 1.0;
double r117187 = r117186 - r117184;
double r117188 = sqrt(r117187);
double r117189 = atan2(r117185, r117188);
double r117190 = r117167 * r117189;
double r117191 = r117166 * r117190;
return r117191;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r117192 = R;
double r117193 = 2.0;
double r117194 = phi1;
double r117195 = r117194 / r117193;
double r117196 = sin(r117195);
double r117197 = phi2;
double r117198 = r117197 / r117193;
double r117199 = cos(r117198);
double r117200 = r117196 * r117199;
double r117201 = cos(r117195);
double r117202 = sin(r117198);
double r117203 = r117201 * r117202;
double r117204 = r117200 - r117203;
double r117205 = pow(r117204, r117193);
double r117206 = cos(r117194);
double r117207 = cos(r117197);
double r117208 = r117206 * r117207;
double r117209 = lambda1;
double r117210 = lambda2;
double r117211 = r117209 - r117210;
double r117212 = r117211 / r117193;
double r117213 = sin(r117212);
double r117214 = r117208 * r117213;
double r117215 = r117214 * r117213;
double r117216 = r117205 + r117215;
double r117217 = sqrt(r117216);
double r117218 = 1.0;
double r117219 = r117209 / r117193;
double r117220 = sin(r117219);
double r117221 = r117210 / r117193;
double r117222 = cos(r117221);
double r117223 = r117220 * r117222;
double r117224 = cos(r117219);
double r117225 = sin(r117221);
double r117226 = r117224 * r117225;
double r117227 = r117223 - r117226;
double r117228 = r117208 * r117227;
double r117229 = r117228 * r117227;
double r117230 = r117205 + r117229;
double r117231 = r117218 - r117230;
double r117232 = sqrt(r117231);
double r117233 = atan2(r117217, r117232);
double r117234 = r117193 * r117233;
double r117235 = r117192 * r117234;
return r117235;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
rmApplied div-sub24.4
Applied sin-diff24.6
rmApplied div-sub24.6
Applied sin-diff24.1
rmApplied div-sub24.1
Applied sin-diff14.2
rmApplied div-sub14.2
Applied sin-diff13.5
Final simplification13.5
herbie shell --seed 2019356 +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))))))))))