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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r113345 = R;
double r113346 = 2.0;
double r113347 = phi1;
double r113348 = phi2;
double r113349 = r113347 - r113348;
double r113350 = r113349 / r113346;
double r113351 = sin(r113350);
double r113352 = pow(r113351, r113346);
double r113353 = cos(r113347);
double r113354 = cos(r113348);
double r113355 = r113353 * r113354;
double r113356 = lambda1;
double r113357 = lambda2;
double r113358 = r113356 - r113357;
double r113359 = r113358 / r113346;
double r113360 = sin(r113359);
double r113361 = r113355 * r113360;
double r113362 = r113361 * r113360;
double r113363 = r113352 + r113362;
double r113364 = sqrt(r113363);
double r113365 = 1.0;
double r113366 = r113365 - r113363;
double r113367 = sqrt(r113366);
double r113368 = atan2(r113364, r113367);
double r113369 = r113346 * r113368;
double r113370 = r113345 * r113369;
return r113370;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r113371 = R;
double r113372 = 2.0;
double r113373 = phi1;
double r113374 = r113373 / r113372;
double r113375 = sin(r113374);
double r113376 = phi2;
double r113377 = r113376 / r113372;
double r113378 = cos(r113377);
double r113379 = r113375 * r113378;
double r113380 = cos(r113374);
double r113381 = sin(r113377);
double r113382 = r113380 * r113381;
double r113383 = r113379 - r113382;
double r113384 = pow(r113383, r113372);
double r113385 = cos(r113373);
double r113386 = cos(r113376);
double r113387 = r113385 * r113386;
double r113388 = lambda1;
double r113389 = lambda2;
double r113390 = r113388 - r113389;
double r113391 = r113390 / r113372;
double r113392 = sin(r113391);
double r113393 = r113387 * r113392;
double r113394 = r113393 * r113392;
double r113395 = r113384 + r113394;
double r113396 = sqrt(r113395);
double r113397 = 1.0;
double r113398 = exp(r113392);
double r113399 = log(r113398);
double r113400 = r113387 * r113399;
double r113401 = r113400 * r113392;
double r113402 = r113384 + r113401;
double r113403 = r113397 - r113402;
double r113404 = sqrt(r113403);
double r113405 = atan2(r113396, r113404);
double r113406 = r113372 * r113405;
double r113407 = r113371 * r113406;
return r113407;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.5
rmApplied div-sub24.5
Applied sin-diff23.8
rmApplied div-sub23.8
Applied sin-diff14.0
rmApplied add-log-exp14.0
Final simplification14.0
herbie shell --seed 2020083 +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))))))))))