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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r86431 = R;
double r86432 = 2.0;
double r86433 = phi1;
double r86434 = phi2;
double r86435 = r86433 - r86434;
double r86436 = r86435 / r86432;
double r86437 = sin(r86436);
double r86438 = pow(r86437, r86432);
double r86439 = cos(r86433);
double r86440 = cos(r86434);
double r86441 = r86439 * r86440;
double r86442 = lambda1;
double r86443 = lambda2;
double r86444 = r86442 - r86443;
double r86445 = r86444 / r86432;
double r86446 = sin(r86445);
double r86447 = r86441 * r86446;
double r86448 = r86447 * r86446;
double r86449 = r86438 + r86448;
double r86450 = sqrt(r86449);
double r86451 = 1.0;
double r86452 = r86451 - r86449;
double r86453 = sqrt(r86452);
double r86454 = atan2(r86450, r86453);
double r86455 = r86432 * r86454;
double r86456 = r86431 * r86455;
return r86456;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r86457 = R;
double r86458 = 2.0;
double r86459 = phi1;
double r86460 = r86459 / r86458;
double r86461 = sin(r86460);
double r86462 = phi2;
double r86463 = r86462 / r86458;
double r86464 = cos(r86463);
double r86465 = r86461 * r86464;
double r86466 = cos(r86460);
double r86467 = sin(r86463);
double r86468 = r86466 * r86467;
double r86469 = r86465 - r86468;
double r86470 = pow(r86469, r86458);
double r86471 = cos(r86459);
double r86472 = cos(r86462);
double r86473 = r86471 * r86472;
double r86474 = lambda1;
double r86475 = lambda2;
double r86476 = r86474 - r86475;
double r86477 = r86476 / r86458;
double r86478 = sin(r86477);
double r86479 = r86473 * r86478;
double r86480 = r86479 * r86478;
double r86481 = r86470 + r86480;
double r86482 = sqrt(r86481);
double r86483 = 1.0;
double r86484 = 3.0;
double r86485 = pow(r86478, r86484);
double r86486 = cbrt(r86485);
double r86487 = r86473 * r86486;
double r86488 = r86487 * r86478;
double r86489 = r86470 + r86488;
double r86490 = r86483 - r86489;
double r86491 = sqrt(r86490);
double r86492 = atan2(r86482, r86491);
double r86493 = r86458 * r86492;
double r86494 = r86457 * r86493;
return r86494;
}



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.0
rmApplied add-cbrt-cube14.0
Simplified14.0
Final simplification14.0
herbie shell --seed 2020042
(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))))))))))