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(2 \cdot R\right) \cdot \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 \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)\right)\right)}}{\sqrt{\cos \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 - \phi_2}{2}\right) - \left(\cos \phi_1 \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}\right) \cdot \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right) \cdot \cos \phi_2\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r1287199 = R;
double r1287200 = 2.0;
double r1287201 = phi1;
double r1287202 = phi2;
double r1287203 = r1287201 - r1287202;
double r1287204 = r1287203 / r1287200;
double r1287205 = sin(r1287204);
double r1287206 = pow(r1287205, r1287200);
double r1287207 = cos(r1287201);
double r1287208 = cos(r1287202);
double r1287209 = r1287207 * r1287208;
double r1287210 = lambda1;
double r1287211 = lambda2;
double r1287212 = r1287210 - r1287211;
double r1287213 = r1287212 / r1287200;
double r1287214 = sin(r1287213);
double r1287215 = r1287209 * r1287214;
double r1287216 = r1287215 * r1287214;
double r1287217 = r1287206 + r1287216;
double r1287218 = sqrt(r1287217);
double r1287219 = 1.0;
double r1287220 = r1287219 - r1287217;
double r1287221 = sqrt(r1287220);
double r1287222 = atan2(r1287218, r1287221);
double r1287223 = r1287200 * r1287222;
double r1287224 = r1287199 * r1287223;
return r1287224;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r1287225 = 2.0;
double r1287226 = R;
double r1287227 = r1287225 * r1287226;
double r1287228 = phi2;
double r1287229 = cos(r1287228);
double r1287230 = lambda1;
double r1287231 = lambda2;
double r1287232 = r1287230 - r1287231;
double r1287233 = r1287232 / r1287225;
double r1287234 = sin(r1287233);
double r1287235 = r1287229 * r1287234;
double r1287236 = phi1;
double r1287237 = cos(r1287236);
double r1287238 = r1287234 * r1287237;
double r1287239 = r1287236 - r1287228;
double r1287240 = r1287239 / r1287225;
double r1287241 = sin(r1287240);
double r1287242 = log1p(r1287241);
double r1287243 = expm1(r1287242);
double r1287244 = r1287241 * r1287243;
double r1287245 = fma(r1287235, r1287238, r1287244);
double r1287246 = sqrt(r1287245);
double r1287247 = cos(r1287240);
double r1287248 = r1287247 * r1287247;
double r1287249 = r1287234 * r1287234;
double r1287250 = r1287234 * r1287249;
double r1287251 = cbrt(r1287250);
double r1287252 = r1287237 * r1287251;
double r1287253 = log1p(r1287234);
double r1287254 = expm1(r1287253);
double r1287255 = r1287254 * r1287229;
double r1287256 = r1287252 * r1287255;
double r1287257 = r1287248 - r1287256;
double r1287258 = sqrt(r1287257);
double r1287259 = atan2(r1287246, r1287258);
double r1287260 = r1287227 * r1287259;
return r1287260;
}



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.0
rmApplied expm1-log1p-u24.1
rmApplied add-cbrt-cube24.1
rmApplied expm1-log1p-u24.1
Final simplification24.1
herbie shell --seed 2019155 +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))))))))))