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)\tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right), \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}}{\sqrt{\cos \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 - \phi_2}{2}\right) - \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right) \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right)}} \cdot \left(R + R\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2900392 = R;
double r2900393 = 2.0;
double r2900394 = phi1;
double r2900395 = phi2;
double r2900396 = r2900394 - r2900395;
double r2900397 = r2900396 / r2900393;
double r2900398 = sin(r2900397);
double r2900399 = pow(r2900398, r2900393);
double r2900400 = cos(r2900394);
double r2900401 = cos(r2900395);
double r2900402 = r2900400 * r2900401;
double r2900403 = lambda1;
double r2900404 = lambda2;
double r2900405 = r2900403 - r2900404;
double r2900406 = r2900405 / r2900393;
double r2900407 = sin(r2900406);
double r2900408 = r2900402 * r2900407;
double r2900409 = r2900408 * r2900407;
double r2900410 = r2900399 + r2900409;
double r2900411 = sqrt(r2900410);
double r2900412 = 1.0;
double r2900413 = r2900412 - r2900410;
double r2900414 = sqrt(r2900413);
double r2900415 = atan2(r2900411, r2900414);
double r2900416 = r2900393 * r2900415;
double r2900417 = r2900392 * r2900416;
return r2900417;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2900418 = lambda1;
double r2900419 = lambda2;
double r2900420 = r2900418 - r2900419;
double r2900421 = 2.0;
double r2900422 = r2900420 / r2900421;
double r2900423 = sin(r2900422);
double r2900424 = phi1;
double r2900425 = cos(r2900424);
double r2900426 = phi2;
double r2900427 = cos(r2900426);
double r2900428 = r2900425 * r2900427;
double r2900429 = r2900423 * r2900428;
double r2900430 = r2900424 - r2900426;
double r2900431 = r2900430 / r2900421;
double r2900432 = sin(r2900431);
double r2900433 = r2900432 * r2900432;
double r2900434 = fma(r2900429, r2900423, r2900433);
double r2900435 = sqrt(r2900434);
double r2900436 = cos(r2900431);
double r2900437 = r2900436 * r2900436;
double r2900438 = r2900419 / r2900421;
double r2900439 = cos(r2900438);
double r2900440 = r2900418 / r2900421;
double r2900441 = sin(r2900440);
double r2900442 = r2900439 * r2900441;
double r2900443 = cos(r2900440);
double r2900444 = sin(r2900438);
double r2900445 = r2900443 * r2900444;
double r2900446 = r2900442 - r2900445;
double r2900447 = r2900428 * r2900446;
double r2900448 = log1p(r2900446);
double r2900449 = expm1(r2900448);
double r2900450 = r2900447 * r2900449;
double r2900451 = r2900437 - r2900450;
double r2900452 = sqrt(r2900451);
double r2900453 = atan2(r2900435, r2900452);
double r2900454 = R;
double r2900455 = r2900454 + r2900454;
double r2900456 = r2900453 * r2900455;
return r2900456;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.4
Simplified24.3
rmApplied expm1-log1p-u24.3
rmApplied div-sub24.3
Applied sin-diff24.5
rmApplied div-sub24.5
Applied sin-diff24.1
Final simplification24.1
herbie shell --seed 2019163 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* 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))))))))))