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 \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 \sqrt[3]{{\left(\sqrt[3]{{\left(\sqrt[3]{{\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)}^{6}} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)}^{3}}\right)}^{3}}\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 r81261 = R;
double r81262 = 2.0;
double r81263 = phi1;
double r81264 = phi2;
double r81265 = r81263 - r81264;
double r81266 = r81265 / r81262;
double r81267 = sin(r81266);
double r81268 = pow(r81267, r81262);
double r81269 = cos(r81263);
double r81270 = cos(r81264);
double r81271 = r81269 * r81270;
double r81272 = lambda1;
double r81273 = lambda2;
double r81274 = r81272 - r81273;
double r81275 = r81274 / r81262;
double r81276 = sin(r81275);
double r81277 = r81271 * r81276;
double r81278 = r81277 * r81276;
double r81279 = r81268 + r81278;
double r81280 = sqrt(r81279);
double r81281 = 1.0;
double r81282 = r81281 - r81279;
double r81283 = sqrt(r81282);
double r81284 = atan2(r81280, r81283);
double r81285 = r81262 * r81284;
double r81286 = r81261 * r81285;
return r81286;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r81287 = R;
double r81288 = 2.0;
double r81289 = phi1;
double r81290 = phi2;
double r81291 = r81289 - r81290;
double r81292 = r81291 / r81288;
double r81293 = sin(r81292);
double r81294 = pow(r81293, r81288);
double r81295 = cos(r81289);
double r81296 = cos(r81290);
double r81297 = r81295 * r81296;
double r81298 = lambda1;
double r81299 = lambda2;
double r81300 = r81298 - r81299;
double r81301 = r81300 / r81288;
double r81302 = sin(r81301);
double r81303 = r81297 * r81302;
double r81304 = r81303 * r81302;
double r81305 = r81294 + r81304;
double r81306 = sqrt(r81305);
double r81307 = 1.0;
double r81308 = cbrt(r81302);
double r81309 = 6.0;
double r81310 = pow(r81308, r81309);
double r81311 = cbrt(r81310);
double r81312 = r81311 * r81308;
double r81313 = 3.0;
double r81314 = pow(r81312, r81313);
double r81315 = cbrt(r81314);
double r81316 = pow(r81315, r81313);
double r81317 = cbrt(r81316);
double r81318 = r81297 * r81317;
double r81319 = r81318 * r81302;
double r81320 = r81294 + r81319;
double r81321 = r81307 - r81320;
double r81322 = sqrt(r81321);
double r81323 = atan2(r81306, r81322);
double r81324 = r81288 * r81323;
double r81325 = r81287 * r81324;
return r81325;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.8
rmApplied add-cbrt-cube24.8
Simplified24.8
rmApplied add-cbrt-cube24.8
Simplified24.8
rmApplied add-cube-cbrt24.9
Simplified24.9
Final simplification24.9
herbie shell --seed 2020046
(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))))))))))