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, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \mathsf{expm1}\left(\mathsf{log1p}\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r70313 = R;
double r70314 = 2.0;
double r70315 = phi1;
double r70316 = phi2;
double r70317 = r70315 - r70316;
double r70318 = r70317 / r70314;
double r70319 = sin(r70318);
double r70320 = pow(r70319, r70314);
double r70321 = cos(r70315);
double r70322 = cos(r70316);
double r70323 = r70321 * r70322;
double r70324 = lambda1;
double r70325 = lambda2;
double r70326 = r70324 - r70325;
double r70327 = r70326 / r70314;
double r70328 = sin(r70327);
double r70329 = r70323 * r70328;
double r70330 = r70329 * r70328;
double r70331 = r70320 + r70330;
double r70332 = sqrt(r70331);
double r70333 = 1.0;
double r70334 = r70333 - r70331;
double r70335 = sqrt(r70334);
double r70336 = atan2(r70332, r70335);
double r70337 = r70314 * r70336;
double r70338 = r70313 * r70337;
return r70338;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r70339 = R;
double r70340 = 2.0;
double r70341 = r70339 * r70340;
double r70342 = phi1;
double r70343 = cos(r70342);
double r70344 = phi2;
double r70345 = cos(r70344);
double r70346 = r70343 * r70345;
double r70347 = lambda1;
double r70348 = lambda2;
double r70349 = r70347 - r70348;
double r70350 = r70349 / r70340;
double r70351 = sin(r70350);
double r70352 = log1p(r70351);
double r70353 = expm1(r70352);
double r70354 = r70351 * r70353;
double r70355 = r70342 - r70344;
double r70356 = r70355 / r70340;
double r70357 = sin(r70356);
double r70358 = pow(r70357, r70340);
double r70359 = fma(r70346, r70354, r70358);
double r70360 = sqrt(r70359);
double r70361 = 1.0;
double r70362 = exp(r70351);
double r70363 = log(r70362);
double r70364 = log1p(r70363);
double r70365 = expm1(r70364);
double r70366 = r70365 * r70363;
double r70367 = fma(r70346, r70366, r70358);
double r70368 = r70361 - r70367;
double r70369 = sqrt(r70368);
double r70370 = atan2(r70360, r70369);
double r70371 = r70341 * r70370;
return r70371;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.5
Simplified24.6
rmApplied expm1-log1p-u24.6
rmApplied add-log-exp24.6
rmApplied expm1-log1p-u24.6
rmApplied add-log-exp24.6
Final simplification24.6
herbie shell --seed 2019209 +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))))))))))