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(\left(\lambda_1 - \lambda_2\right) \cdot \mathsf{expm1}\left(\left(\mathsf{log1p}\left(\left(\cos \left(\phi_2 \cdot \frac{1}{2}\right) \cdot \cos \left(\phi_1 \cdot \frac{1}{2}\right) - \sin \left(\phi_1 \cdot \frac{1}{2}\right) \cdot \sin \left(\phi_2 \cdot \frac{1}{2}\right)\right)\right)\right)\right)\right), \left(\phi_1 - \phi_2\right)\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2976656 = R;
double r2976657 = lambda1;
double r2976658 = lambda2;
double r2976659 = r2976657 - r2976658;
double r2976660 = phi1;
double r2976661 = phi2;
double r2976662 = r2976660 + r2976661;
double r2976663 = 2.0;
double r2976664 = r2976662 / r2976663;
double r2976665 = cos(r2976664);
double r2976666 = r2976659 * r2976665;
double r2976667 = r2976666 * r2976666;
double r2976668 = r2976660 - r2976661;
double r2976669 = r2976668 * r2976668;
double r2976670 = r2976667 + r2976669;
double r2976671 = sqrt(r2976670);
double r2976672 = r2976656 * r2976671;
return r2976672;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2976673 = lambda1;
double r2976674 = lambda2;
double r2976675 = r2976673 - r2976674;
double r2976676 = phi2;
double r2976677 = 0.5;
double r2976678 = r2976676 * r2976677;
double r2976679 = cos(r2976678);
double r2976680 = phi1;
double r2976681 = r2976680 * r2976677;
double r2976682 = cos(r2976681);
double r2976683 = r2976679 * r2976682;
double r2976684 = sin(r2976681);
double r2976685 = sin(r2976678);
double r2976686 = r2976684 * r2976685;
double r2976687 = r2976683 - r2976686;
double r2976688 = log1p(r2976687);
double r2976689 = expm1(r2976688);
double r2976690 = r2976675 * r2976689;
double r2976691 = r2976680 - r2976676;
double r2976692 = hypot(r2976690, r2976691);
double r2976693 = R;
double r2976694 = r2976692 * r2976693;
return r2976694;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 37.2
Simplified3.8
Taylor expanded around -inf 3.8
Simplified3.8
rmApplied distribute-rgt-in3.8
Applied cos-sum0.1
rmApplied expm1-log1p-u0.1
Final simplification0.1
herbie shell --seed 2019133 +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))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))