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)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 \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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 \log \left(e^{\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r100169 = R;
double r100170 = 2.0;
double r100171 = phi1;
double r100172 = phi2;
double r100173 = r100171 - r100172;
double r100174 = r100173 / r100170;
double r100175 = sin(r100174);
double r100176 = pow(r100175, r100170);
double r100177 = cos(r100171);
double r100178 = cos(r100172);
double r100179 = r100177 * r100178;
double r100180 = lambda1;
double r100181 = lambda2;
double r100182 = r100180 - r100181;
double r100183 = r100182 / r100170;
double r100184 = sin(r100183);
double r100185 = r100179 * r100184;
double r100186 = r100185 * r100184;
double r100187 = r100176 + r100186;
double r100188 = sqrt(r100187);
double r100189 = 1.0;
double r100190 = r100189 - r100187;
double r100191 = sqrt(r100190);
double r100192 = atan2(r100188, r100191);
double r100193 = r100170 * r100192;
double r100194 = r100169 * r100193;
return r100194;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r100195 = R;
double r100196 = 2.0;
double r100197 = phi1;
double r100198 = phi2;
double r100199 = r100197 - r100198;
double r100200 = r100199 / r100196;
double r100201 = sin(r100200);
double r100202 = pow(r100201, r100196);
double r100203 = cos(r100197);
double r100204 = cos(r100198);
double r100205 = r100203 * r100204;
double r100206 = lambda1;
double r100207 = lambda2;
double r100208 = r100206 - r100207;
double r100209 = r100208 / r100196;
double r100210 = sin(r100209);
double r100211 = r100205 * r100210;
double r100212 = log1p(r100210);
double r100213 = expm1(r100212);
double r100214 = r100211 * r100213;
double r100215 = r100202 + r100214;
double r100216 = sqrt(r100215);
double r100217 = 1.0;
double r100218 = 3.0;
double r100219 = pow(r100210, r100218);
double r100220 = cbrt(r100219);
double r100221 = exp(r100220);
double r100222 = log(r100221);
double r100223 = r100211 * r100222;
double r100224 = r100202 + r100223;
double r100225 = r100217 - r100224;
double r100226 = sqrt(r100225);
double r100227 = atan2(r100216, r100226);
double r100228 = r100196 * r100227;
double r100229 = r100195 * r100228;
return r100229;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.2
rmApplied add-log-exp24.2
rmApplied add-cbrt-cube24.2
Simplified24.2
rmApplied expm1-log1p-u24.2
Final simplification24.2
herbie shell --seed 2020035 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
:precision binary64
(* 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))))))))))