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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}}{\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 r71367 = R;
double r71368 = 2.0;
double r71369 = phi1;
double r71370 = phi2;
double r71371 = r71369 - r71370;
double r71372 = r71371 / r71368;
double r71373 = sin(r71372);
double r71374 = pow(r71373, r71368);
double r71375 = cos(r71369);
double r71376 = cos(r71370);
double r71377 = r71375 * r71376;
double r71378 = lambda1;
double r71379 = lambda2;
double r71380 = r71378 - r71379;
double r71381 = r71380 / r71368;
double r71382 = sin(r71381);
double r71383 = r71377 * r71382;
double r71384 = r71383 * r71382;
double r71385 = r71374 + r71384;
double r71386 = sqrt(r71385);
double r71387 = 1.0;
double r71388 = r71387 - r71385;
double r71389 = sqrt(r71388);
double r71390 = atan2(r71386, r71389);
double r71391 = r71368 * r71390;
double r71392 = r71367 * r71391;
return r71392;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r71393 = R;
double r71394 = 2.0;
double r71395 = phi1;
double r71396 = r71395 / r71394;
double r71397 = sin(r71396);
double r71398 = phi2;
double r71399 = r71398 / r71394;
double r71400 = cos(r71399);
double r71401 = r71397 * r71400;
double r71402 = cos(r71396);
double r71403 = sin(r71399);
double r71404 = r71402 * r71403;
double r71405 = r71401 - r71404;
double r71406 = pow(r71405, r71394);
double r71407 = cos(r71395);
double r71408 = cos(r71398);
double r71409 = r71407 * r71408;
double r71410 = lambda1;
double r71411 = lambda2;
double r71412 = r71410 - r71411;
double r71413 = r71412 / r71394;
double r71414 = sin(r71413);
double r71415 = r71409 * r71414;
double r71416 = 3.0;
double r71417 = pow(r71414, r71416);
double r71418 = cbrt(r71417);
double r71419 = r71415 * r71418;
double r71420 = r71406 + r71419;
double r71421 = sqrt(r71420);
double r71422 = 1.0;
double r71423 = exp(r71414);
double r71424 = log(r71423);
double r71425 = r71409 * r71424;
double r71426 = r71425 * r71414;
double r71427 = r71406 + r71426;
double r71428 = r71422 - r71427;
double r71429 = sqrt(r71428);
double r71430 = atan2(r71421, r71429);
double r71431 = r71394 * r71430;
double r71432 = r71393 * r71431;
return r71432;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.0
rmApplied div-sub24.0
Applied sin-diff23.4
rmApplied div-sub23.4
Applied sin-diff13.7
rmApplied add-log-exp13.7
rmApplied add-cbrt-cube14.0
Simplified14.0
Final simplification14.0
herbie shell --seed 2019323
(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))))))))))