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(\tan^{-1}_* \frac{\sqrt{\left(\left(\cos \phi_1 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \cos \phi_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) - \sin \left(\frac{\phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1}{2}\right)\right)}^{2}}}{\sqrt{\left(1 - {\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \sin \left(\frac{\phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1}{2}\right)\right)}^{2}\right) - \left(\left(\left(\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \sqrt[3]{\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)}\right) \cdot \cos \phi_1\right) \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}} \cdot 2\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80290 = R;
double r80291 = 2.0;
double r80292 = phi1;
double r80293 = phi2;
double r80294 = r80292 - r80293;
double r80295 = r80294 / r80291;
double r80296 = sin(r80295);
double r80297 = pow(r80296, r80291);
double r80298 = cos(r80292);
double r80299 = cos(r80293);
double r80300 = r80298 * r80299;
double r80301 = lambda1;
double r80302 = lambda2;
double r80303 = r80301 - r80302;
double r80304 = r80303 / r80291;
double r80305 = sin(r80304);
double r80306 = r80300 * r80305;
double r80307 = r80306 * r80305;
double r80308 = r80297 + r80307;
double r80309 = sqrt(r80308);
double r80310 = 1.0;
double r80311 = r80310 - r80308;
double r80312 = sqrt(r80311);
double r80313 = atan2(r80309, r80312);
double r80314 = r80291 * r80313;
double r80315 = r80290 * r80314;
return r80315;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80316 = R;
double r80317 = phi1;
double r80318 = cos(r80317);
double r80319 = lambda1;
double r80320 = lambda2;
double r80321 = r80319 - r80320;
double r80322 = 2.0;
double r80323 = r80321 / r80322;
double r80324 = sin(r80323);
double r80325 = r80318 * r80324;
double r80326 = phi2;
double r80327 = cos(r80326);
double r80328 = r80325 * r80327;
double r80329 = r80328 * r80324;
double r80330 = r80317 / r80322;
double r80331 = sin(r80330);
double r80332 = r80326 / r80322;
double r80333 = cos(r80332);
double r80334 = r80331 * r80333;
double r80335 = sin(r80332);
double r80336 = cos(r80330);
double r80337 = r80335 * r80336;
double r80338 = r80334 - r80337;
double r80339 = pow(r80338, r80322);
double r80340 = r80329 + r80339;
double r80341 = sqrt(r80340);
double r80342 = 1.0;
double r80343 = r80342 - r80339;
double r80344 = cbrt(r80324);
double r80345 = r80344 * r80344;
double r80346 = exp(r80324);
double r80347 = log(r80346);
double r80348 = cbrt(r80347);
double r80349 = r80345 * r80348;
double r80350 = r80349 * r80318;
double r80351 = r80350 * r80327;
double r80352 = r80351 * r80324;
double r80353 = r80343 - r80352;
double r80354 = sqrt(r80353);
double r80355 = atan2(r80341, r80354);
double r80356 = r80355 * r80322;
double r80357 = r80316 * r80356;
return r80357;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.5
Simplified24.5
rmApplied div-sub24.5
Applied sin-diff23.9
Simplified23.9
rmApplied div-sub23.9
Applied sin-diff14.2
Simplified14.2
rmApplied add-cube-cbrt14.3
rmApplied add-log-exp14.3
Final simplification14.3
herbie shell --seed 2019195
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))