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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sqrt[3]{{\left(\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r123259 = R;
double r123260 = 2.0;
double r123261 = phi1;
double r123262 = phi2;
double r123263 = r123261 - r123262;
double r123264 = r123263 / r123260;
double r123265 = sin(r123264);
double r123266 = pow(r123265, r123260);
double r123267 = cos(r123261);
double r123268 = cos(r123262);
double r123269 = r123267 * r123268;
double r123270 = lambda1;
double r123271 = lambda2;
double r123272 = r123270 - r123271;
double r123273 = r123272 / r123260;
double r123274 = sin(r123273);
double r123275 = r123269 * r123274;
double r123276 = r123275 * r123274;
double r123277 = r123266 + r123276;
double r123278 = sqrt(r123277);
double r123279 = 1.0;
double r123280 = r123279 - r123277;
double r123281 = sqrt(r123280);
double r123282 = atan2(r123278, r123281);
double r123283 = r123260 * r123282;
double r123284 = r123259 * r123283;
return r123284;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r123285 = R;
double r123286 = 2.0;
double r123287 = phi1;
double r123288 = r123287 / r123286;
double r123289 = sin(r123288);
double r123290 = phi2;
double r123291 = r123290 / r123286;
double r123292 = cos(r123291);
double r123293 = r123289 * r123292;
double r123294 = cos(r123288);
double r123295 = sin(r123291);
double r123296 = r123294 * r123295;
double r123297 = r123293 - r123296;
double r123298 = pow(r123297, r123286);
double r123299 = cos(r123287);
double r123300 = cos(r123290);
double r123301 = r123299 * r123300;
double r123302 = lambda1;
double r123303 = lambda2;
double r123304 = r123302 - r123303;
double r123305 = r123304 / r123286;
double r123306 = sin(r123305);
double r123307 = r123301 * r123306;
double r123308 = r123307 * r123306;
double r123309 = r123298 + r123308;
double r123310 = sqrt(r123309);
double r123311 = 1.0;
double r123312 = 3.0;
double r123313 = pow(r123306, r123312);
double r123314 = cbrt(r123313);
double r123315 = pow(r123314, r123312);
double r123316 = cbrt(r123315);
double r123317 = r123307 * r123316;
double r123318 = r123298 + r123317;
double r123319 = r123311 - r123318;
double r123320 = sqrt(r123319);
double r123321 = atan2(r123310, r123320);
double r123322 = r123286 * r123321;
double r123323 = r123285 * r123322;
return r123323;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.3
rmApplied div-sub24.3
Applied sin-diff23.7
rmApplied div-sub23.7
Applied sin-diff14.2
rmApplied add-cbrt-cube14.2
Simplified14.2
rmApplied add-cbrt-cube14.2
Simplified14.2
Final simplification14.2
herbie shell --seed 2020027
(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))))))))))