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)\tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\cos \phi_2 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \cos \phi_1, \sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}}{\sqrt{\cos \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 - \phi_2}{2}\right) - \left(\left(\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right) \cdot \cos \phi_2\right) \cdot \left(\left(\log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right) + \log \left(\sqrt{e^{\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)}}\right)\right) \cdot \cos \phi_1\right)}} \cdot \left(2 \cdot R\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r1555191 = R;
double r1555192 = 2.0;
double r1555193 = phi1;
double r1555194 = phi2;
double r1555195 = r1555193 - r1555194;
double r1555196 = r1555195 / r1555192;
double r1555197 = sin(r1555196);
double r1555198 = pow(r1555197, r1555192);
double r1555199 = cos(r1555193);
double r1555200 = cos(r1555194);
double r1555201 = r1555199 * r1555200;
double r1555202 = lambda1;
double r1555203 = lambda2;
double r1555204 = r1555202 - r1555203;
double r1555205 = r1555204 / r1555192;
double r1555206 = sin(r1555205);
double r1555207 = r1555201 * r1555206;
double r1555208 = r1555207 * r1555206;
double r1555209 = r1555198 + r1555208;
double r1555210 = sqrt(r1555209);
double r1555211 = 1.0;
double r1555212 = r1555211 - r1555209;
double r1555213 = sqrt(r1555212);
double r1555214 = atan2(r1555210, r1555213);
double r1555215 = r1555192 * r1555214;
double r1555216 = r1555191 * r1555215;
return r1555216;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r1555217 = phi2;
double r1555218 = cos(r1555217);
double r1555219 = lambda1;
double r1555220 = lambda2;
double r1555221 = r1555219 - r1555220;
double r1555222 = 2.0;
double r1555223 = r1555221 / r1555222;
double r1555224 = sin(r1555223);
double r1555225 = r1555218 * r1555224;
double r1555226 = phi1;
double r1555227 = cos(r1555226);
double r1555228 = r1555224 * r1555227;
double r1555229 = r1555226 - r1555217;
double r1555230 = r1555229 / r1555222;
double r1555231 = sin(r1555230);
double r1555232 = r1555231 * r1555231;
double r1555233 = fma(r1555225, r1555228, r1555232);
double r1555234 = sqrt(r1555233);
double r1555235 = cos(r1555230);
double r1555236 = r1555235 * r1555235;
double r1555237 = r1555220 / r1555222;
double r1555238 = cos(r1555237);
double r1555239 = r1555219 / r1555222;
double r1555240 = sin(r1555239);
double r1555241 = r1555238 * r1555240;
double r1555242 = cos(r1555239);
double r1555243 = sin(r1555237);
double r1555244 = r1555242 * r1555243;
double r1555245 = r1555241 - r1555244;
double r1555246 = r1555245 * r1555218;
double r1555247 = exp(r1555224);
double r1555248 = sqrt(r1555247);
double r1555249 = log(r1555248);
double r1555250 = exp(r1555245);
double r1555251 = sqrt(r1555250);
double r1555252 = log(r1555251);
double r1555253 = r1555249 + r1555252;
double r1555254 = r1555253 * r1555227;
double r1555255 = r1555246 * r1555254;
double r1555256 = r1555236 - r1555255;
double r1555257 = sqrt(r1555256);
double r1555258 = atan2(r1555234, r1555257);
double r1555259 = R;
double r1555260 = r1555222 * r1555259;
double r1555261 = r1555258 * r1555260;
return r1555261;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 23.9
Simplified23.9
rmApplied add-log-exp23.9
rmApplied add-sqr-sqrt23.9
Applied log-prod23.9
rmApplied div-sub23.9
Applied sin-diff23.9
rmApplied div-sub23.9
Applied sin-diff23.8
Final simplification23.8
herbie shell --seed 2019156 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* 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))))))))))