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)\left(2 \cdot \tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \cos \phi_1, \cos \phi_2 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \cos \phi_1, \cos \phi_2 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3313402 = R;
double r3313403 = 2.0;
double r3313404 = phi1;
double r3313405 = phi2;
double r3313406 = r3313404 - r3313405;
double r3313407 = r3313406 / r3313403;
double r3313408 = sin(r3313407);
double r3313409 = pow(r3313408, r3313403);
double r3313410 = cos(r3313404);
double r3313411 = cos(r3313405);
double r3313412 = r3313410 * r3313411;
double r3313413 = lambda1;
double r3313414 = lambda2;
double r3313415 = r3313413 - r3313414;
double r3313416 = r3313415 / r3313403;
double r3313417 = sin(r3313416);
double r3313418 = r3313412 * r3313417;
double r3313419 = r3313418 * r3313417;
double r3313420 = r3313409 + r3313419;
double r3313421 = sqrt(r3313420);
double r3313422 = 1.0;
double r3313423 = r3313422 - r3313420;
double r3313424 = sqrt(r3313423);
double r3313425 = atan2(r3313421, r3313424);
double r3313426 = r3313403 * r3313425;
double r3313427 = r3313402 * r3313426;
return r3313427;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3313428 = 2.0;
double r3313429 = lambda1;
double r3313430 = lambda2;
double r3313431 = r3313429 - r3313430;
double r3313432 = r3313431 / r3313428;
double r3313433 = sin(r3313432);
double r3313434 = phi1;
double r3313435 = cos(r3313434);
double r3313436 = r3313433 * r3313435;
double r3313437 = phi2;
double r3313438 = cos(r3313437);
double r3313439 = r3313438 * r3313433;
double r3313440 = r3313434 - r3313437;
double r3313441 = r3313440 / r3313428;
double r3313442 = sin(r3313441);
double r3313443 = pow(r3313442, r3313428);
double r3313444 = fma(r3313436, r3313439, r3313443);
double r3313445 = sqrt(r3313444);
double r3313446 = 1.0;
double r3313447 = r3313446 - r3313444;
double r3313448 = sqrt(r3313447);
double r3313449 = atan2(r3313445, r3313448);
double r3313450 = r3313428 * r3313449;
double r3313451 = R;
double r3313452 = r3313450 * r3313451;
return r3313452;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 25.0
Simplified25.0
Final simplification25.0
herbie shell --seed 2019170 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))