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(\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)\right) + \mathsf{fma}\left(-\sin \left(\phi_2 \cdot 0.5\right), \sin \left(\phi_1 \cdot 0.5\right), \sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r5177688 = R;
double r5177689 = lambda1;
double r5177690 = lambda2;
double r5177691 = r5177689 - r5177690;
double r5177692 = phi1;
double r5177693 = phi2;
double r5177694 = r5177692 + r5177693;
double r5177695 = 2.0;
double r5177696 = r5177694 / r5177695;
double r5177697 = cos(r5177696);
double r5177698 = r5177691 * r5177697;
double r5177699 = r5177698 * r5177698;
double r5177700 = r5177692 - r5177693;
double r5177701 = r5177700 * r5177700;
double r5177702 = r5177699 + r5177701;
double r5177703 = sqrt(r5177702);
double r5177704 = r5177688 * r5177703;
return r5177704;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r5177705 = phi2;
double r5177706 = 0.5;
double r5177707 = r5177705 * r5177706;
double r5177708 = cos(r5177707);
double r5177709 = phi1;
double r5177710 = r5177709 * r5177706;
double r5177711 = cos(r5177710);
double r5177712 = r5177708 * r5177711;
double r5177713 = sin(r5177707);
double r5177714 = sin(r5177710);
double r5177715 = r5177713 * r5177714;
double r5177716 = r5177712 - r5177715;
double r5177717 = -r5177713;
double r5177718 = fma(r5177717, r5177714, r5177715);
double r5177719 = r5177716 + r5177718;
double r5177720 = lambda1;
double r5177721 = lambda2;
double r5177722 = r5177720 - r5177721;
double r5177723 = r5177719 * r5177722;
double r5177724 = r5177709 - r5177705;
double r5177725 = hypot(r5177723, r5177724);
double r5177726 = R;
double r5177727 = r5177725 * r5177726;
return r5177727;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 39.9
Simplified3.9
Taylor expanded around inf 3.9
Simplified3.9
rmApplied distribute-rgt-in3.9
Applied cos-sum0.1
rmApplied *-commutative0.1
rmApplied prod-diff0.1
Simplified0.1
Final simplification0.1
herbie shell --seed 2019174 +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))))))