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(\left(\lambda_1 - \lambda_2\right) \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\phi_1 \cdot 0.5\right) \cdot \cos \left(\phi_2 \cdot 0.5\right) - \sin \left(\phi_1 \cdot 0.5\right) \cdot \sin \left(\phi_2 \cdot 0.5\right)\right)\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3159527 = R;
double r3159528 = lambda1;
double r3159529 = lambda2;
double r3159530 = r3159528 - r3159529;
double r3159531 = phi1;
double r3159532 = phi2;
double r3159533 = r3159531 + r3159532;
double r3159534 = 2.0;
double r3159535 = r3159533 / r3159534;
double r3159536 = cos(r3159535);
double r3159537 = r3159530 * r3159536;
double r3159538 = r3159537 * r3159537;
double r3159539 = r3159531 - r3159532;
double r3159540 = r3159539 * r3159539;
double r3159541 = r3159538 + r3159540;
double r3159542 = sqrt(r3159541);
double r3159543 = r3159527 * r3159542;
return r3159543;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3159544 = lambda1;
double r3159545 = lambda2;
double r3159546 = r3159544 - r3159545;
double r3159547 = phi1;
double r3159548 = 0.5;
double r3159549 = r3159547 * r3159548;
double r3159550 = cos(r3159549);
double r3159551 = phi2;
double r3159552 = r3159551 * r3159548;
double r3159553 = cos(r3159552);
double r3159554 = r3159550 * r3159553;
double r3159555 = sin(r3159549);
double r3159556 = sin(r3159552);
double r3159557 = r3159555 * r3159556;
double r3159558 = r3159554 - r3159557;
double r3159559 = log1p(r3159558);
double r3159560 = expm1(r3159559);
double r3159561 = r3159546 * r3159560;
double r3159562 = r3159547 - r3159551;
double r3159563 = hypot(r3159561, r3159562);
double r3159564 = R;
double r3159565 = r3159563 * r3159564;
return r3159565;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.3
Simplified3.7
Taylor expanded around inf 3.7
rmApplied distribute-lft-in3.7
Applied cos-sum0.1
rmApplied expm1-log1p-u0.1
Final simplification0.1
herbie shell --seed 2019200 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))