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(\sin \left(\phi_1 \cdot \frac{1}{2}\right) \cdot \left(\lambda_2 - \lambda_1\right)\right) \cdot \sin \left(\frac{1}{2} \cdot \phi_2\right) - \left(\cos \left(\phi_1 \cdot \frac{1}{2}\right) \cdot \cos \left(\frac{1}{2} \cdot \phi_2\right)\right) \cdot \left(\lambda_2 - \lambda_1\right)\right), \left(\phi_1 - \phi_2\right)\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r10798640 = R;
double r10798641 = lambda1;
double r10798642 = lambda2;
double r10798643 = r10798641 - r10798642;
double r10798644 = phi1;
double r10798645 = phi2;
double r10798646 = r10798644 + r10798645;
double r10798647 = 2.0;
double r10798648 = r10798646 / r10798647;
double r10798649 = cos(r10798648);
double r10798650 = r10798643 * r10798649;
double r10798651 = r10798650 * r10798650;
double r10798652 = r10798644 - r10798645;
double r10798653 = r10798652 * r10798652;
double r10798654 = r10798651 + r10798653;
double r10798655 = sqrt(r10798654);
double r10798656 = r10798640 * r10798655;
return r10798656;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r10798657 = phi1;
double r10798658 = 0.5;
double r10798659 = r10798657 * r10798658;
double r10798660 = sin(r10798659);
double r10798661 = lambda2;
double r10798662 = lambda1;
double r10798663 = r10798661 - r10798662;
double r10798664 = r10798660 * r10798663;
double r10798665 = phi2;
double r10798666 = r10798658 * r10798665;
double r10798667 = sin(r10798666);
double r10798668 = r10798664 * r10798667;
double r10798669 = cos(r10798659);
double r10798670 = cos(r10798666);
double r10798671 = r10798669 * r10798670;
double r10798672 = r10798671 * r10798663;
double r10798673 = r10798668 - r10798672;
double r10798674 = r10798657 - r10798665;
double r10798675 = hypot(r10798673, r10798674);
double r10798676 = R;
double r10798677 = r10798675 * r10798676;
return r10798677;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 37.0
Simplified3.7
Taylor expanded around -inf 3.7
rmApplied distribute-lft-in3.7
Applied cos-sum0.1
Taylor expanded around -inf 0.1
Simplified0.1
Taylor expanded around inf 0.1
Simplified0.1
Final simplification0.1
herbie shell --seed 2019124 +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))))))