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)2 \cdot \left(\tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \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(\cos \phi_1 \cdot \cos \phi_2, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}} \cdot R\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104364 = R;
double r104365 = 2.0;
double r104366 = phi1;
double r104367 = phi2;
double r104368 = r104366 - r104367;
double r104369 = r104368 / r104365;
double r104370 = sin(r104369);
double r104371 = pow(r104370, r104365);
double r104372 = cos(r104366);
double r104373 = cos(r104367);
double r104374 = r104372 * r104373;
double r104375 = lambda1;
double r104376 = lambda2;
double r104377 = r104375 - r104376;
double r104378 = r104377 / r104365;
double r104379 = sin(r104378);
double r104380 = r104374 * r104379;
double r104381 = r104380 * r104379;
double r104382 = r104371 + r104381;
double r104383 = sqrt(r104382);
double r104384 = 1.0;
double r104385 = r104384 - r104382;
double r104386 = sqrt(r104385);
double r104387 = atan2(r104383, r104386);
double r104388 = r104365 * r104387;
double r104389 = r104364 * r104388;
return r104389;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104390 = 2.0;
double r104391 = phi1;
double r104392 = cos(r104391);
double r104393 = phi2;
double r104394 = cos(r104393);
double r104395 = r104392 * r104394;
double r104396 = lambda1;
double r104397 = lambda2;
double r104398 = r104396 - r104397;
double r104399 = r104398 / r104390;
double r104400 = sin(r104399);
double r104401 = r104400 * r104400;
double r104402 = r104391 - r104393;
double r104403 = r104402 / r104390;
double r104404 = sin(r104403);
double r104405 = pow(r104404, r104390);
double r104406 = fma(r104395, r104401, r104405);
double r104407 = sqrt(r104406);
double r104408 = 1.0;
double r104409 = r104408 - r104406;
double r104410 = sqrt(r104409);
double r104411 = atan2(r104407, r104410);
double r104412 = R;
double r104413 = r104411 * r104412;
double r104414 = r104390 * r104413;
return r104414;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.3
Simplified24.3
Final simplification24.3
herbie shell --seed 2020045 +o rules:numerics
(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))))))))))