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(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right), \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_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}\right)}}{\sqrt{1 - \mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \sqrt[3]{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \left(\cos \phi_1 \cdot \cos \phi_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}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3661219 = R;
double r3661220 = 2.0;
double r3661221 = phi1;
double r3661222 = phi2;
double r3661223 = r3661221 - r3661222;
double r3661224 = r3661223 / r3661220;
double r3661225 = sin(r3661224);
double r3661226 = pow(r3661225, r3661220);
double r3661227 = cos(r3661221);
double r3661228 = cos(r3661222);
double r3661229 = r3661227 * r3661228;
double r3661230 = lambda1;
double r3661231 = lambda2;
double r3661232 = r3661230 - r3661231;
double r3661233 = r3661232 / r3661220;
double r3661234 = sin(r3661233);
double r3661235 = r3661229 * r3661234;
double r3661236 = r3661235 * r3661234;
double r3661237 = r3661226 + r3661236;
double r3661238 = sqrt(r3661237);
double r3661239 = 1.0;
double r3661240 = r3661239 - r3661237;
double r3661241 = sqrt(r3661240);
double r3661242 = atan2(r3661238, r3661241);
double r3661243 = r3661220 * r3661242;
double r3661244 = r3661219 * r3661243;
return r3661244;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3661245 = R;
double r3661246 = 2.0;
double r3661247 = r3661245 * r3661246;
double r3661248 = lambda1;
double r3661249 = lambda2;
double r3661250 = r3661248 - r3661249;
double r3661251 = r3661250 / r3661246;
double r3661252 = sin(r3661251);
double r3661253 = expm1(r3661252);
double r3661254 = log1p(r3661253);
double r3661255 = phi1;
double r3661256 = cos(r3661255);
double r3661257 = phi2;
double r3661258 = cos(r3661257);
double r3661259 = r3661256 * r3661258;
double r3661260 = r3661252 * r3661259;
double r3661261 = r3661255 / r3661246;
double r3661262 = sin(r3661261);
double r3661263 = r3661257 / r3661246;
double r3661264 = cos(r3661263);
double r3661265 = r3661262 * r3661264;
double r3661266 = sin(r3661263);
double r3661267 = cos(r3661261);
double r3661268 = r3661266 * r3661267;
double r3661269 = r3661265 - r3661268;
double r3661270 = pow(r3661269, r3661246);
double r3661271 = fma(r3661254, r3661260, r3661270);
double r3661272 = sqrt(r3661271);
double r3661273 = 1.0;
double r3661274 = r3661252 * r3661252;
double r3661275 = r3661274 * r3661252;
double r3661276 = cbrt(r3661275);
double r3661277 = r3661276 * r3661259;
double r3661278 = fma(r3661252, r3661277, r3661270);
double r3661279 = r3661273 - r3661278;
double r3661280 = sqrt(r3661279);
double r3661281 = atan2(r3661272, r3661280);
double r3661282 = r3661247 * r3661281;
return r3661282;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.1
Simplified24.1
rmApplied div-sub24.1
Applied sin-diff23.5
rmApplied div-sub23.5
Applied sin-diff13.9
rmApplied log1p-expm1-u14.0
rmApplied add-cbrt-cube14.0
Final simplification14.0
herbie shell --seed 2019200 +o rules:numerics
(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))))))))))