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 \tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \left(\cos \phi_1 \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) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\left(\sqrt[3]{\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}, \left(\cos \phi_1 \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) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2}\right)}}\right) \cdot 2double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r83211 = R;
double r83212 = 2.0;
double r83213 = phi1;
double r83214 = phi2;
double r83215 = r83213 - r83214;
double r83216 = r83215 / r83212;
double r83217 = sin(r83216);
double r83218 = pow(r83217, r83212);
double r83219 = cos(r83213);
double r83220 = cos(r83214);
double r83221 = r83219 * r83220;
double r83222 = lambda1;
double r83223 = lambda2;
double r83224 = r83222 - r83223;
double r83225 = r83224 / r83212;
double r83226 = sin(r83225);
double r83227 = r83221 * r83226;
double r83228 = r83227 * r83226;
double r83229 = r83218 + r83228;
double r83230 = sqrt(r83229);
double r83231 = 1.0;
double r83232 = r83231 - r83229;
double r83233 = sqrt(r83232);
double r83234 = atan2(r83230, r83233);
double r83235 = r83212 * r83234;
double r83236 = r83211 * r83235;
return r83236;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r83237 = R;
double r83238 = lambda1;
double r83239 = lambda2;
double r83240 = r83238 - r83239;
double r83241 = 2.0;
double r83242 = r83240 / r83241;
double r83243 = sin(r83242);
double r83244 = phi1;
double r83245 = cos(r83244);
double r83246 = phi2;
double r83247 = cos(r83246);
double r83248 = r83245 * r83247;
double r83249 = r83248 * r83243;
double r83250 = r83244 / r83241;
double r83251 = sin(r83250);
double r83252 = r83246 / r83241;
double r83253 = cos(r83252);
double r83254 = r83251 * r83253;
double r83255 = cos(r83250);
double r83256 = sin(r83252);
double r83257 = r83255 * r83256;
double r83258 = r83254 - r83257;
double r83259 = pow(r83258, r83241);
double r83260 = fma(r83243, r83249, r83259);
double r83261 = sqrt(r83260);
double r83262 = 1.0;
double r83263 = exp(r83243);
double r83264 = log(r83263);
double r83265 = cbrt(r83264);
double r83266 = cbrt(r83243);
double r83267 = r83265 * r83266;
double r83268 = r83267 * r83266;
double r83269 = fma(r83268, r83249, r83259);
double r83270 = r83262 - r83269;
double r83271 = sqrt(r83270);
double r83272 = atan2(r83261, r83271);
double r83273 = r83237 * r83272;
double r83274 = r83273 * r83241;
return r83274;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.5
Simplified24.5
rmApplied div-sub24.5
Applied sin-diff23.9
rmApplied div-sub23.9
Applied sin-diff14.2
rmApplied add-cube-cbrt14.3
rmApplied add-log-exp14.3
Final simplification14.3
herbie shell --seed 2019195 +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))))))))))