R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\mathsf{hypot}\left(\frac{\mathsf{fma}\left(\lambda_1 - \lambda_2, {\left(\cos \left(0.5 \cdot \phi_2\right)\right)}^{2} \cdot {\left(\cos \left(0.5 \cdot \phi_1\right)\right)}^{2}, \left(\lambda_1 - \lambda_2\right) \cdot \left(\left(-{\left(\sin \left(0.5 \cdot \phi_2\right)\right)}^{2}\right) \cdot {\left(\sin \left(0.5 \cdot \phi_1\right)\right)}^{2}\right)\right)}{\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) + \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)}, \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r99487 = R;
double r99488 = lambda1;
double r99489 = lambda2;
double r99490 = r99488 - r99489;
double r99491 = phi1;
double r99492 = phi2;
double r99493 = r99491 + r99492;
double r99494 = 2.0;
double r99495 = r99493 / r99494;
double r99496 = cos(r99495);
double r99497 = r99490 * r99496;
double r99498 = r99497 * r99497;
double r99499 = r99491 - r99492;
double r99500 = r99499 * r99499;
double r99501 = r99498 + r99500;
double r99502 = sqrt(r99501);
double r99503 = r99487 * r99502;
return r99503;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r99504 = lambda1;
double r99505 = lambda2;
double r99506 = r99504 - r99505;
double r99507 = 0.5;
double r99508 = phi2;
double r99509 = r99507 * r99508;
double r99510 = cos(r99509);
double r99511 = 2.0;
double r99512 = pow(r99510, r99511);
double r99513 = phi1;
double r99514 = r99507 * r99513;
double r99515 = cos(r99514);
double r99516 = pow(r99515, r99511);
double r99517 = r99512 * r99516;
double r99518 = sin(r99509);
double r99519 = pow(r99518, r99511);
double r99520 = -r99519;
double r99521 = sin(r99514);
double r99522 = pow(r99521, r99511);
double r99523 = r99520 * r99522;
double r99524 = r99506 * r99523;
double r99525 = fma(r99506, r99517, r99524);
double r99526 = r99508 * r99507;
double r99527 = cos(r99526);
double r99528 = r99513 * r99507;
double r99529 = cos(r99528);
double r99530 = r99527 * r99529;
double r99531 = sin(r99526);
double r99532 = sin(r99528);
double r99533 = r99531 * r99532;
double r99534 = r99530 + r99533;
double r99535 = r99525 / r99534;
double r99536 = r99513 - r99508;
double r99537 = hypot(r99535, r99536);
double r99538 = R;
double r99539 = r99537 * r99538;
return r99539;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 39.0
Simplified3.8
Taylor expanded around inf 3.8
Simplified3.8
rmApplied distribute-lft-in3.8
Applied cos-sum0.1
Simplified0.1
Simplified0.1
rmApplied flip--0.1
Applied associate-*l/0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2020024 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
:precision binary64
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))