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, \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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, \sqrt[3]{{\left(\sqrt[3]{{\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)}^{6}} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)}^{3}} \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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 r127402 = R;
double r127403 = 2.0;
double r127404 = phi1;
double r127405 = phi2;
double r127406 = r127404 - r127405;
double r127407 = r127406 / r127403;
double r127408 = sin(r127407);
double r127409 = pow(r127408, r127403);
double r127410 = cos(r127404);
double r127411 = cos(r127405);
double r127412 = r127410 * r127411;
double r127413 = lambda1;
double r127414 = lambda2;
double r127415 = r127413 - r127414;
double r127416 = r127415 / r127403;
double r127417 = sin(r127416);
double r127418 = r127412 * r127417;
double r127419 = r127418 * r127417;
double r127420 = r127409 + r127419;
double r127421 = sqrt(r127420);
double r127422 = 1.0;
double r127423 = r127422 - r127420;
double r127424 = sqrt(r127423);
double r127425 = atan2(r127421, r127424);
double r127426 = r127403 * r127425;
double r127427 = r127402 * r127426;
return r127427;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r127428 = 2.0;
double r127429 = phi1;
double r127430 = cos(r127429);
double r127431 = phi2;
double r127432 = cos(r127431);
double r127433 = r127430 * r127432;
double r127434 = lambda1;
double r127435 = lambda2;
double r127436 = r127434 - r127435;
double r127437 = r127436 / r127428;
double r127438 = sin(r127437);
double r127439 = log1p(r127438);
double r127440 = expm1(r127439);
double r127441 = r127440 * r127438;
double r127442 = r127429 - r127431;
double r127443 = r127442 / r127428;
double r127444 = sin(r127443);
double r127445 = pow(r127444, r127428);
double r127446 = fma(r127433, r127441, r127445);
double r127447 = sqrt(r127446);
double r127448 = 1.0;
double r127449 = cbrt(r127438);
double r127450 = 6.0;
double r127451 = pow(r127449, r127450);
double r127452 = cbrt(r127451);
double r127453 = r127452 * r127449;
double r127454 = 3.0;
double r127455 = pow(r127453, r127454);
double r127456 = cbrt(r127455);
double r127457 = expm1(r127438);
double r127458 = log1p(r127457);
double r127459 = r127456 * r127458;
double r127460 = fma(r127433, r127459, r127445);
double r127461 = r127448 - r127460;
double r127462 = sqrt(r127461);
double r127463 = atan2(r127447, r127462);
double r127464 = R;
double r127465 = r127463 * r127464;
double r127466 = r127428 * r127465;
return r127466;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.8
Simplified24.8
rmApplied expm1-log1p-u24.8
rmApplied add-cbrt-cube24.8
Simplified24.8
rmApplied log1p-expm1-u24.8
rmApplied add-cube-cbrt24.9
Simplified24.9
Final simplification24.9
herbie shell --seed 2020046 +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))))))))))