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 \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\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 r80049 = R;
double r80050 = 2.0;
double r80051 = phi1;
double r80052 = phi2;
double r80053 = r80051 - r80052;
double r80054 = r80053 / r80050;
double r80055 = sin(r80054);
double r80056 = pow(r80055, r80050);
double r80057 = cos(r80051);
double r80058 = cos(r80052);
double r80059 = r80057 * r80058;
double r80060 = lambda1;
double r80061 = lambda2;
double r80062 = r80060 - r80061;
double r80063 = r80062 / r80050;
double r80064 = sin(r80063);
double r80065 = r80059 * r80064;
double r80066 = r80065 * r80064;
double r80067 = r80056 + r80066;
double r80068 = sqrt(r80067);
double r80069 = 1.0;
double r80070 = r80069 - r80067;
double r80071 = sqrt(r80070);
double r80072 = atan2(r80068, r80071);
double r80073 = r80050 * r80072;
double r80074 = r80049 * r80073;
return r80074;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80075 = R;
double r80076 = 2.0;
double r80077 = phi1;
double r80078 = phi2;
double r80079 = r80077 - r80078;
double r80080 = r80079 / r80076;
double r80081 = sin(r80080);
double r80082 = pow(r80081, r80076);
double r80083 = cos(r80077);
double r80084 = cos(r80078);
double r80085 = r80083 * r80084;
double r80086 = lambda1;
double r80087 = lambda2;
double r80088 = r80086 - r80087;
double r80089 = r80088 / r80076;
double r80090 = sin(r80089);
double r80091 = r80085 * r80090;
double r80092 = r80091 * r80090;
double r80093 = r80082 + r80092;
double r80094 = sqrt(r80093);
double r80095 = 1.0;
double r80096 = exp(r80090);
double r80097 = log(r80096);
double r80098 = r80085 * r80097;
double r80099 = r80098 * r80090;
double r80100 = r80082 + r80099;
double r80101 = r80095 - r80100;
double r80102 = sqrt(r80101);
double r80103 = atan2(r80094, r80102);
double r80104 = r80076 * r80103;
double r80105 = r80075 * r80104;
return r80105;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 25.1
rmApplied add-log-exp25.1
Final simplification25.1
herbie shell --seed 2019354
(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))))))))))