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)\tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\cos \phi_2 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \cos \phi_1, \sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}}{\sqrt{\cos \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 - \phi_2}{2}\right) - \left(\frac{\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) - \cos \left(\lambda_1 - \lambda_2\right) \cdot \left(\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \sin \left(\frac{\lambda_2}{2}\right) \cdot \cos \left(\frac{\lambda_1}{2}\right)\right)}}{\sqrt[3]{2}} \cdot \cos \phi_1\right) \cdot \left(\cos \phi_2 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}} \cdot \left(R \cdot 2\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r1156277 = R;
double r1156278 = 2.0;
double r1156279 = phi1;
double r1156280 = phi2;
double r1156281 = r1156279 - r1156280;
double r1156282 = r1156281 / r1156278;
double r1156283 = sin(r1156282);
double r1156284 = pow(r1156283, r1156278);
double r1156285 = cos(r1156279);
double r1156286 = cos(r1156280);
double r1156287 = r1156285 * r1156286;
double r1156288 = lambda1;
double r1156289 = lambda2;
double r1156290 = r1156288 - r1156289;
double r1156291 = r1156290 / r1156278;
double r1156292 = sin(r1156291);
double r1156293 = r1156287 * r1156292;
double r1156294 = r1156293 * r1156292;
double r1156295 = r1156284 + r1156294;
double r1156296 = sqrt(r1156295);
double r1156297 = 1.0;
double r1156298 = r1156297 - r1156295;
double r1156299 = sqrt(r1156298);
double r1156300 = atan2(r1156296, r1156299);
double r1156301 = r1156278 * r1156300;
double r1156302 = r1156277 * r1156301;
return r1156302;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r1156303 = phi2;
double r1156304 = cos(r1156303);
double r1156305 = lambda1;
double r1156306 = lambda2;
double r1156307 = r1156305 - r1156306;
double r1156308 = 2.0;
double r1156309 = r1156307 / r1156308;
double r1156310 = sin(r1156309);
double r1156311 = r1156304 * r1156310;
double r1156312 = phi1;
double r1156313 = cos(r1156312);
double r1156314 = r1156310 * r1156313;
double r1156315 = r1156312 - r1156303;
double r1156316 = r1156315 / r1156308;
double r1156317 = sin(r1156316);
double r1156318 = r1156317 * r1156317;
double r1156319 = fma(r1156311, r1156314, r1156318);
double r1156320 = sqrt(r1156319);
double r1156321 = cos(r1156316);
double r1156322 = r1156321 * r1156321;
double r1156323 = cos(r1156307);
double r1156324 = r1156306 / r1156308;
double r1156325 = cos(r1156324);
double r1156326 = r1156305 / r1156308;
double r1156327 = sin(r1156326);
double r1156328 = r1156325 * r1156327;
double r1156329 = sin(r1156324);
double r1156330 = cos(r1156326);
double r1156331 = r1156329 * r1156330;
double r1156332 = r1156328 - r1156331;
double r1156333 = r1156323 * r1156332;
double r1156334 = r1156310 - r1156333;
double r1156335 = cbrt(r1156334);
double r1156336 = cbrt(r1156308);
double r1156337 = r1156335 / r1156336;
double r1156338 = r1156337 * r1156313;
double r1156339 = r1156338 * r1156311;
double r1156340 = r1156322 - r1156339;
double r1156341 = sqrt(r1156340);
double r1156342 = atan2(r1156320, r1156341);
double r1156343 = R;
double r1156344 = r1156343 * r1156308;
double r1156345 = r1156342 * r1156344;
return r1156345;
}



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.0
rmApplied add-cbrt-cube24.0
rmApplied sin-mult24.0
Applied associate-*l/24.0
Applied cbrt-div24.0
Simplified24.0
rmApplied div-sub24.0
Applied sin-diff24.1
Final simplification24.1
herbie shell --seed 2019153 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* 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))))))))))