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(\tan^{-1}_* \frac{\sqrt{\sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1 - \phi_2}{2}\right) + \left(\left(\cos \phi_2 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{\cos \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 - \phi_2}{2}\right) - \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \left(\cos \phi_1 \cdot \left(\left(\log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right) + \left(\log \left(\sqrt{e^{\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right)}}\right) - \log \left(\sqrt{e^{\sin \left(\frac{\lambda_2}{2}\right) \cdot \cos \left(\frac{\lambda_1}{2}\right)}}\right)\right)\right) \cdot \cos \phi_2\right)\right)}} \cdot R\right) \cdot 2double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r988200 = R;
double r988201 = 2.0;
double r988202 = phi1;
double r988203 = phi2;
double r988204 = r988202 - r988203;
double r988205 = r988204 / r988201;
double r988206 = sin(r988205);
double r988207 = pow(r988206, r988201);
double r988208 = cos(r988202);
double r988209 = cos(r988203);
double r988210 = r988208 * r988209;
double r988211 = lambda1;
double r988212 = lambda2;
double r988213 = r988211 - r988212;
double r988214 = r988213 / r988201;
double r988215 = sin(r988214);
double r988216 = r988210 * r988215;
double r988217 = r988216 * r988215;
double r988218 = r988207 + r988217;
double r988219 = sqrt(r988218);
double r988220 = 1.0;
double r988221 = r988220 - r988218;
double r988222 = sqrt(r988221);
double r988223 = atan2(r988219, r988222);
double r988224 = r988201 * r988223;
double r988225 = r988200 * r988224;
return r988225;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r988226 = phi1;
double r988227 = phi2;
double r988228 = r988226 - r988227;
double r988229 = 2.0;
double r988230 = r988228 / r988229;
double r988231 = sin(r988230);
double r988232 = r988231 * r988231;
double r988233 = cos(r988227);
double r988234 = lambda1;
double r988235 = lambda2;
double r988236 = r988234 - r988235;
double r988237 = r988236 / r988229;
double r988238 = sin(r988237);
double r988239 = r988233 * r988238;
double r988240 = cos(r988226);
double r988241 = r988239 * r988240;
double r988242 = r988241 * r988238;
double r988243 = r988232 + r988242;
double r988244 = sqrt(r988243);
double r988245 = cos(r988230);
double r988246 = r988245 * r988245;
double r988247 = exp(r988238);
double r988248 = log(r988247);
double r988249 = sqrt(r988247);
double r988250 = log(r988249);
double r988251 = r988235 / r988229;
double r988252 = cos(r988251);
double r988253 = r988234 / r988229;
double r988254 = sin(r988253);
double r988255 = r988252 * r988254;
double r988256 = exp(r988255);
double r988257 = sqrt(r988256);
double r988258 = log(r988257);
double r988259 = sin(r988251);
double r988260 = cos(r988253);
double r988261 = r988259 * r988260;
double r988262 = exp(r988261);
double r988263 = sqrt(r988262);
double r988264 = log(r988263);
double r988265 = r988258 - r988264;
double r988266 = r988250 + r988265;
double r988267 = r988266 * r988233;
double r988268 = r988240 * r988267;
double r988269 = r988248 * r988268;
double r988270 = r988246 - r988269;
double r988271 = sqrt(r988270);
double r988272 = atan2(r988244, r988271);
double r988273 = R;
double r988274 = r988272 * r988273;
double r988275 = r988274 * r988229;
return r988275;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 23.9
Simplified23.8
rmApplied add-log-exp23.8
rmApplied add-log-exp23.9
rmApplied add-sqr-sqrt23.9
Applied log-prod23.9
rmApplied div-sub23.9
Applied sin-diff23.9
Applied exp-diff23.9
Applied sqrt-div23.9
Applied log-div23.9
Final simplification23.9
herbie shell --seed 2019156
(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))))))))))