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 - \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 \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104308 = R;
double r104309 = 2.0;
double r104310 = phi1;
double r104311 = phi2;
double r104312 = r104310 - r104311;
double r104313 = r104312 / r104309;
double r104314 = sin(r104313);
double r104315 = pow(r104314, r104309);
double r104316 = cos(r104310);
double r104317 = cos(r104311);
double r104318 = r104316 * r104317;
double r104319 = lambda1;
double r104320 = lambda2;
double r104321 = r104319 - r104320;
double r104322 = r104321 / r104309;
double r104323 = sin(r104322);
double r104324 = r104318 * r104323;
double r104325 = r104324 * r104323;
double r104326 = r104315 + r104325;
double r104327 = sqrt(r104326);
double r104328 = 1.0;
double r104329 = r104328 - r104326;
double r104330 = sqrt(r104329);
double r104331 = atan2(r104327, r104330);
double r104332 = r104309 * r104331;
double r104333 = r104308 * r104332;
return r104333;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104334 = R;
double r104335 = 2.0;
double r104336 = phi1;
double r104337 = phi2;
double r104338 = r104336 - r104337;
double r104339 = r104338 / r104335;
double r104340 = sin(r104339);
double r104341 = pow(r104340, r104335);
double r104342 = cos(r104336);
double r104343 = cos(r104337);
double r104344 = r104342 * r104343;
double r104345 = lambda1;
double r104346 = lambda2;
double r104347 = r104345 - r104346;
double r104348 = r104347 / r104335;
double r104349 = sin(r104348);
double r104350 = r104344 * r104349;
double r104351 = r104350 * r104349;
double r104352 = r104341 + r104351;
double r104353 = sqrt(r104352);
double r104354 = 1.0;
double r104355 = log1p(r104349);
double r104356 = expm1(r104355);
double r104357 = r104344 * r104356;
double r104358 = 3.0;
double r104359 = pow(r104349, r104358);
double r104360 = cbrt(r104359);
double r104361 = r104357 * r104360;
double r104362 = r104341 + r104361;
double r104363 = r104354 - r104362;
double r104364 = sqrt(r104363);
double r104365 = atan2(r104353, r104364);
double r104366 = r104335 * r104365;
double r104367 = r104334 * r104366;
return r104367;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.3
rmApplied expm1-log1p-u24.3
rmApplied add-cbrt-cube24.4
Simplified24.4
Final simplification24.4
herbie shell --seed 2020047 +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))))))))))