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(\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\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 r92425 = R;
double r92426 = 2.0;
double r92427 = phi1;
double r92428 = phi2;
double r92429 = r92427 - r92428;
double r92430 = r92429 / r92426;
double r92431 = sin(r92430);
double r92432 = pow(r92431, r92426);
double r92433 = cos(r92427);
double r92434 = cos(r92428);
double r92435 = r92433 * r92434;
double r92436 = lambda1;
double r92437 = lambda2;
double r92438 = r92436 - r92437;
double r92439 = r92438 / r92426;
double r92440 = sin(r92439);
double r92441 = r92435 * r92440;
double r92442 = r92441 * r92440;
double r92443 = r92432 + r92442;
double r92444 = sqrt(r92443);
double r92445 = 1.0;
double r92446 = r92445 - r92443;
double r92447 = sqrt(r92446);
double r92448 = atan2(r92444, r92447);
double r92449 = r92426 * r92448;
double r92450 = r92425 * r92449;
return r92450;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r92451 = R;
double r92452 = 2.0;
double r92453 = phi1;
double r92454 = r92453 / r92452;
double r92455 = sin(r92454);
double r92456 = phi2;
double r92457 = r92456 / r92452;
double r92458 = cos(r92457);
double r92459 = r92455 * r92458;
double r92460 = cos(r92454);
double r92461 = sin(r92457);
double r92462 = r92460 * r92461;
double r92463 = r92459 - r92462;
double r92464 = pow(r92463, r92452);
double r92465 = cos(r92453);
double r92466 = cos(r92456);
double r92467 = r92465 * r92466;
double r92468 = lambda1;
double r92469 = lambda2;
double r92470 = r92468 - r92469;
double r92471 = r92470 / r92452;
double r92472 = sin(r92471);
double r92473 = r92467 * r92472;
double r92474 = r92473 * r92472;
double r92475 = r92464 + r92474;
double r92476 = sqrt(r92475);
double r92477 = 1.0;
double r92478 = cbrt(r92472);
double r92479 = r92478 * r92478;
double r92480 = r92479 * r92478;
double r92481 = r92467 * r92480;
double r92482 = r92481 * r92472;
double r92483 = r92464 + r92482;
double r92484 = r92477 - r92483;
double r92485 = sqrt(r92484);
double r92486 = atan2(r92476, r92485);
double r92487 = r92452 * r92486;
double r92488 = r92451 * r92487;
return r92488;
}



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-diff23.9
rmApplied div-sub23.9
Applied sin-diff14.3
rmApplied add-log-exp14.3
rmApplied add-cube-cbrt14.4
Simplified14.4
Simplified14.4
Final simplification14.4
herbie shell --seed 2020001
(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))))))))))