R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80010 = R;
double r80011 = 2.0;
double r80012 = phi1;
double r80013 = phi2;
double r80014 = r80012 - r80013;
double r80015 = r80014 / r80011;
double r80016 = sin(r80015);
double r80017 = pow(r80016, r80011);
double r80018 = cos(r80012);
double r80019 = cos(r80013);
double r80020 = r80018 * r80019;
double r80021 = lambda1;
double r80022 = lambda2;
double r80023 = r80021 - r80022;
double r80024 = r80023 / r80011;
double r80025 = sin(r80024);
double r80026 = r80020 * r80025;
double r80027 = r80026 * r80025;
double r80028 = r80017 + r80027;
double r80029 = sqrt(r80028);
double r80030 = 1.0;
double r80031 = r80030 - r80028;
double r80032 = sqrt(r80031);
double r80033 = atan2(r80029, r80032);
double r80034 = r80011 * r80033;
double r80035 = r80010 * r80034;
return r80035;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80036 = R;
double r80037 = 2.0;
double r80038 = phi1;
double r80039 = phi2;
double r80040 = r80038 - r80039;
double r80041 = r80040 / r80037;
double r80042 = sin(r80041);
double r80043 = pow(r80042, r80037);
double r80044 = cos(r80038);
double r80045 = cos(r80039);
double r80046 = r80044 * r80045;
double r80047 = lambda1;
double r80048 = lambda2;
double r80049 = r80047 - r80048;
double r80050 = r80049 / r80037;
double r80051 = sin(r80050);
double r80052 = r80046 * r80051;
double r80053 = r80052 * r80051;
double r80054 = r80043 + r80053;
double r80055 = sqrt(r80054);
double r80056 = 1.0;
double r80057 = r80056 - r80054;
double r80058 = sqrt(r80057);
double r80059 = atan2(r80055, r80058);
double r80060 = r80037 * r80059;
double r80061 = r80036 * r80060;
return r80061;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
Final simplification24.6
herbie shell --seed 2019212 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
:precision binary64
(* R (* 2 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))) (sqrt (- 1 (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))))))))