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 \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r72218 = R;
double r72219 = 2.0;
double r72220 = phi1;
double r72221 = phi2;
double r72222 = r72220 - r72221;
double r72223 = r72222 / r72219;
double r72224 = sin(r72223);
double r72225 = pow(r72224, r72219);
double r72226 = cos(r72220);
double r72227 = cos(r72221);
double r72228 = r72226 * r72227;
double r72229 = lambda1;
double r72230 = lambda2;
double r72231 = r72229 - r72230;
double r72232 = r72231 / r72219;
double r72233 = sin(r72232);
double r72234 = r72228 * r72233;
double r72235 = r72234 * r72233;
double r72236 = r72225 + r72235;
double r72237 = sqrt(r72236);
double r72238 = 1.0;
double r72239 = r72238 - r72236;
double r72240 = sqrt(r72239);
double r72241 = atan2(r72237, r72240);
double r72242 = r72219 * r72241;
double r72243 = r72218 * r72242;
return r72243;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r72244 = R;
double r72245 = 2.0;
double r72246 = phi1;
double r72247 = phi2;
double r72248 = r72246 - r72247;
double r72249 = r72248 / r72245;
double r72250 = sin(r72249);
double r72251 = pow(r72250, r72245);
double r72252 = cos(r72246);
double r72253 = cos(r72247);
double r72254 = r72252 * r72253;
double r72255 = lambda1;
double r72256 = lambda2;
double r72257 = r72255 - r72256;
double r72258 = r72257 / r72245;
double r72259 = sin(r72258);
double r72260 = r72254 * r72259;
double r72261 = r72260 * r72259;
double r72262 = r72251 + r72261;
double r72263 = sqrt(r72262);
double r72264 = 1.0;
double r72265 = exp(r72259);
double r72266 = log(r72265);
double r72267 = r72254 * r72266;
double r72268 = r72267 * r72266;
double r72269 = r72251 + r72268;
double r72270 = r72264 - r72269;
double r72271 = sqrt(r72270);
double r72272 = atan2(r72263, r72271);
double r72273 = r72245 * r72272;
double r72274 = r72244 * r72273;
return r72274;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.1
rmApplied add-log-exp24.1
rmApplied add-log-exp24.2
Final simplification24.2
herbie shell --seed 2019199
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))