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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r69360 = R;
double r69361 = 2.0;
double r69362 = phi1;
double r69363 = phi2;
double r69364 = r69362 - r69363;
double r69365 = r69364 / r69361;
double r69366 = sin(r69365);
double r69367 = pow(r69366, r69361);
double r69368 = cos(r69362);
double r69369 = cos(r69363);
double r69370 = r69368 * r69369;
double r69371 = lambda1;
double r69372 = lambda2;
double r69373 = r69371 - r69372;
double r69374 = r69373 / r69361;
double r69375 = sin(r69374);
double r69376 = r69370 * r69375;
double r69377 = r69376 * r69375;
double r69378 = r69367 + r69377;
double r69379 = sqrt(r69378);
double r69380 = 1.0;
double r69381 = r69380 - r69378;
double r69382 = sqrt(r69381);
double r69383 = atan2(r69379, r69382);
double r69384 = r69361 * r69383;
double r69385 = r69360 * r69384;
return r69385;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r69386 = R;
double r69387 = 2.0;
double r69388 = phi1;
double r69389 = r69388 / r69387;
double r69390 = sin(r69389);
double r69391 = phi2;
double r69392 = r69391 / r69387;
double r69393 = cos(r69392);
double r69394 = r69390 * r69393;
double r69395 = cos(r69389);
double r69396 = sin(r69392);
double r69397 = r69395 * r69396;
double r69398 = r69394 - r69397;
double r69399 = pow(r69398, r69387);
double r69400 = cos(r69388);
double r69401 = cos(r69391);
double r69402 = r69400 * r69401;
double r69403 = lambda1;
double r69404 = lambda2;
double r69405 = r69403 - r69404;
double r69406 = r69405 / r69387;
double r69407 = sin(r69406);
double r69408 = r69402 * r69407;
double r69409 = r69408 * r69407;
double r69410 = r69399 + r69409;
double r69411 = sqrt(r69410);
double r69412 = 1.0;
double r69413 = 3.0;
double r69414 = pow(r69407, r69413);
double r69415 = cbrt(r69414);
double r69416 = r69402 * r69415;
double r69417 = r69416 * r69415;
double r69418 = r69399 + r69417;
double r69419 = r69412 - r69418;
double r69420 = sqrt(r69419);
double r69421 = atan2(r69411, r69420);
double r69422 = r69387 * r69421;
double r69423 = r69386 * r69422;
return r69423;
}



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 div-sub24.6
Applied sin-diff24.0
rmApplied div-sub24.0
Applied sin-diff14.6
rmApplied add-cbrt-cube14.6
Simplified14.6
rmApplied add-cbrt-cube14.6
Simplified14.7
Final simplification14.7
herbie shell --seed 2019353
(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))))))))))