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)\left(R \cdot 2\right) \cdot \tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\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}\right)}}{\sqrt{1 - \mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\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}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r51313 = R;
double r51314 = 2.0;
double r51315 = phi1;
double r51316 = phi2;
double r51317 = r51315 - r51316;
double r51318 = r51317 / r51314;
double r51319 = sin(r51318);
double r51320 = pow(r51319, r51314);
double r51321 = cos(r51315);
double r51322 = cos(r51316);
double r51323 = r51321 * r51322;
double r51324 = lambda1;
double r51325 = lambda2;
double r51326 = r51324 - r51325;
double r51327 = r51326 / r51314;
double r51328 = sin(r51327);
double r51329 = r51323 * r51328;
double r51330 = r51329 * r51328;
double r51331 = r51320 + r51330;
double r51332 = sqrt(r51331);
double r51333 = 1.0;
double r51334 = r51333 - r51331;
double r51335 = sqrt(r51334);
double r51336 = atan2(r51332, r51335);
double r51337 = r51314 * r51336;
double r51338 = r51313 * r51337;
return r51338;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r51339 = R;
double r51340 = 2.0;
double r51341 = r51339 * r51340;
double r51342 = phi1;
double r51343 = cos(r51342);
double r51344 = phi2;
double r51345 = cos(r51344);
double r51346 = r51343 * r51345;
double r51347 = lambda1;
double r51348 = lambda2;
double r51349 = r51347 - r51348;
double r51350 = r51349 / r51340;
double r51351 = sin(r51350);
double r51352 = expm1(r51351);
double r51353 = log1p(r51352);
double r51354 = r51353 * r51351;
double r51355 = r51342 / r51340;
double r51356 = sin(r51355);
double r51357 = r51344 / r51340;
double r51358 = cos(r51357);
double r51359 = r51356 * r51358;
double r51360 = cos(r51355);
double r51361 = sin(r51357);
double r51362 = r51360 * r51361;
double r51363 = r51359 - r51362;
double r51364 = pow(r51363, r51340);
double r51365 = fma(r51346, r51354, r51364);
double r51366 = sqrt(r51365);
double r51367 = 1.0;
double r51368 = exp(r51351);
double r51369 = log(r51368);
double r51370 = r51369 * r51351;
double r51371 = fma(r51346, r51370, r51364);
double r51372 = r51367 - r51371;
double r51373 = sqrt(r51372);
double r51374 = atan2(r51366, r51373);
double r51375 = r51341 * r51374;
return r51375;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.0
Simplified24.1
rmApplied div-sub24.1
Applied sin-diff23.5
rmApplied div-sub23.5
Applied sin-diff13.8
rmApplied add-log-exp13.8
rmApplied log1p-expm1-u13.8
Final simplification13.8
herbie shell --seed 2019323 +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))))))))))