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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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 \left(\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \sqrt[3]{\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 r82298 = R;
double r82299 = 2.0;
double r82300 = phi1;
double r82301 = phi2;
double r82302 = r82300 - r82301;
double r82303 = r82302 / r82299;
double r82304 = sin(r82303);
double r82305 = pow(r82304, r82299);
double r82306 = cos(r82300);
double r82307 = cos(r82301);
double r82308 = r82306 * r82307;
double r82309 = lambda1;
double r82310 = lambda2;
double r82311 = r82309 - r82310;
double r82312 = r82311 / r82299;
double r82313 = sin(r82312);
double r82314 = r82308 * r82313;
double r82315 = r82314 * r82313;
double r82316 = r82305 + r82315;
double r82317 = sqrt(r82316);
double r82318 = 1.0;
double r82319 = r82318 - r82316;
double r82320 = sqrt(r82319);
double r82321 = atan2(r82317, r82320);
double r82322 = r82299 * r82321;
double r82323 = r82298 * r82322;
return r82323;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r82324 = R;
double r82325 = 2.0;
double r82326 = phi1;
double r82327 = r82326 / r82325;
double r82328 = sin(r82327);
double r82329 = phi2;
double r82330 = r82329 / r82325;
double r82331 = cos(r82330);
double r82332 = r82328 * r82331;
double r82333 = cos(r82327);
double r82334 = sin(r82330);
double r82335 = r82333 * r82334;
double r82336 = r82332 - r82335;
double r82337 = pow(r82336, r82325);
double r82338 = cos(r82326);
double r82339 = cos(r82329);
double r82340 = r82338 * r82339;
double r82341 = lambda1;
double r82342 = lambda2;
double r82343 = r82341 - r82342;
double r82344 = r82343 / r82325;
double r82345 = sin(r82344);
double r82346 = r82340 * r82345;
double r82347 = r82346 * r82345;
double r82348 = r82337 + r82347;
double r82349 = sqrt(r82348);
double r82350 = 1.0;
double r82351 = exp(r82345);
double r82352 = log(r82351);
double r82353 = r82340 * r82352;
double r82354 = cbrt(r82345);
double r82355 = r82354 * r82354;
double r82356 = r82355 * r82354;
double r82357 = r82353 * r82356;
double r82358 = r82337 + r82357;
double r82359 = r82350 - r82358;
double r82360 = sqrt(r82359);
double r82361 = atan2(r82349, r82360);
double r82362 = r82325 * r82361;
double r82363 = r82324 * r82362;
return r82363;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
rmApplied div-sub24.4
Applied sin-diff23.9
rmApplied div-sub23.9
Applied sin-diff14.3
rmApplied add-log-exp14.3
rmApplied add-cube-cbrt14.4
Final simplification14.4
herbie shell --seed 2020001 +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))))))))))