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 \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, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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 r75274 = R;
double r75275 = 2.0;
double r75276 = phi1;
double r75277 = phi2;
double r75278 = r75276 - r75277;
double r75279 = r75278 / r75275;
double r75280 = sin(r75279);
double r75281 = pow(r75280, r75275);
double r75282 = cos(r75276);
double r75283 = cos(r75277);
double r75284 = r75282 * r75283;
double r75285 = lambda1;
double r75286 = lambda2;
double r75287 = r75285 - r75286;
double r75288 = r75287 / r75275;
double r75289 = sin(r75288);
double r75290 = r75284 * r75289;
double r75291 = r75290 * r75289;
double r75292 = r75281 + r75291;
double r75293 = sqrt(r75292);
double r75294 = 1.0;
double r75295 = r75294 - r75292;
double r75296 = sqrt(r75295);
double r75297 = atan2(r75293, r75296);
double r75298 = r75275 * r75297;
double r75299 = r75274 * r75298;
return r75299;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r75300 = R;
double r75301 = 2.0;
double r75302 = r75300 * r75301;
double r75303 = phi1;
double r75304 = cos(r75303);
double r75305 = phi2;
double r75306 = cos(r75305);
double r75307 = r75304 * r75306;
double r75308 = lambda1;
double r75309 = lambda2;
double r75310 = r75308 - r75309;
double r75311 = r75310 / r75301;
double r75312 = sin(r75311);
double r75313 = r75312 * r75312;
double r75314 = r75303 / r75301;
double r75315 = sin(r75314);
double r75316 = r75305 / r75301;
double r75317 = cos(r75316);
double r75318 = r75315 * r75317;
double r75319 = cos(r75314);
double r75320 = sin(r75316);
double r75321 = r75319 * r75320;
double r75322 = r75318 - r75321;
double r75323 = pow(r75322, r75301);
double r75324 = fma(r75307, r75313, r75323);
double r75325 = sqrt(r75324);
double r75326 = 1.0;
double r75327 = expm1(r75312);
double r75328 = log1p(r75327);
double r75329 = r75312 * r75328;
double r75330 = fma(r75307, r75329, r75323);
double r75331 = r75326 - r75330;
double r75332 = sqrt(r75331);
double r75333 = atan2(r75325, r75332);
double r75334 = r75302 * r75333;
return r75334;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.4
Simplified24.4
rmApplied div-sub24.4
Applied sin-diff23.8
rmApplied div-sub23.8
Applied sin-diff14.2
rmApplied log1p-expm1-u14.2
Final simplification14.2
herbie shell --seed 2019305 +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))))))))))