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}{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} + \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}{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} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \log \left(e^{\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r65248 = R;
double r65249 = 2.0;
double r65250 = phi1;
double r65251 = phi2;
double r65252 = r65250 - r65251;
double r65253 = r65252 / r65249;
double r65254 = sin(r65253);
double r65255 = pow(r65254, r65249);
double r65256 = cos(r65250);
double r65257 = cos(r65251);
double r65258 = r65256 * r65257;
double r65259 = lambda1;
double r65260 = lambda2;
double r65261 = r65259 - r65260;
double r65262 = r65261 / r65249;
double r65263 = sin(r65262);
double r65264 = r65258 * r65263;
double r65265 = r65264 * r65263;
double r65266 = r65255 + r65265;
double r65267 = sqrt(r65266);
double r65268 = 1.0;
double r65269 = r65268 - r65266;
double r65270 = sqrt(r65269);
double r65271 = atan2(r65267, r65270);
double r65272 = r65249 * r65271;
double r65273 = r65248 * r65272;
return r65273;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r65274 = R;
double r65275 = 2.0;
double r65276 = phi1;
double r65277 = r65276 / r65275;
double r65278 = sin(r65277);
double r65279 = phi2;
double r65280 = r65279 / r65275;
double r65281 = cos(r65280);
double r65282 = r65278 * r65281;
double r65283 = cos(r65277);
double r65284 = sin(r65280);
double r65285 = r65283 * r65284;
double r65286 = r65282 - r65285;
double r65287 = pow(r65286, r65275);
double r65288 = cos(r65276);
double r65289 = cos(r65279);
double r65290 = r65288 * r65289;
double r65291 = lambda1;
double r65292 = lambda2;
double r65293 = r65291 - r65292;
double r65294 = r65293 / r65275;
double r65295 = sin(r65294);
double r65296 = r65290 * r65295;
double r65297 = r65296 * r65295;
double r65298 = r65287 + r65297;
double r65299 = sqrt(r65298);
double r65300 = 1.0;
double r65301 = 3.0;
double r65302 = pow(r65295, r65301);
double r65303 = cbrt(r65302);
double r65304 = exp(r65303);
double r65305 = log(r65304);
double r65306 = r65296 * r65305;
double r65307 = r65287 + r65306;
double r65308 = r65300 - r65307;
double r65309 = sqrt(r65308);
double r65310 = atan2(r65299, r65309);
double r65311 = r65275 * r65310;
double r65312 = r65274 * r65311;
return r65312;
}



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 div-sub24.3
Applied sin-diff23.7
rmApplied div-sub23.7
Applied sin-diff14.0
rmApplied add-log-exp14.0
rmApplied add-cbrt-cube14.0
Simplified14.0
Final simplification14.0
herbie shell --seed 2019303
(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))))))))))