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}{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} + \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}{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} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r106178 = R;
double r106179 = 2.0;
double r106180 = phi1;
double r106181 = phi2;
double r106182 = r106180 - r106181;
double r106183 = r106182 / r106179;
double r106184 = sin(r106183);
double r106185 = pow(r106184, r106179);
double r106186 = cos(r106180);
double r106187 = cos(r106181);
double r106188 = r106186 * r106187;
double r106189 = lambda1;
double r106190 = lambda2;
double r106191 = r106189 - r106190;
double r106192 = r106191 / r106179;
double r106193 = sin(r106192);
double r106194 = r106188 * r106193;
double r106195 = r106194 * r106193;
double r106196 = r106185 + r106195;
double r106197 = sqrt(r106196);
double r106198 = 1.0;
double r106199 = r106198 - r106196;
double r106200 = sqrt(r106199);
double r106201 = atan2(r106197, r106200);
double r106202 = r106179 * r106201;
double r106203 = r106178 * r106202;
return r106203;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r106204 = R;
double r106205 = 2.0;
double r106206 = phi1;
double r106207 = r106206 / r106205;
double r106208 = sin(r106207);
double r106209 = phi2;
double r106210 = r106209 / r106205;
double r106211 = cos(r106210);
double r106212 = r106208 * r106211;
double r106213 = cos(r106207);
double r106214 = sin(r106210);
double r106215 = r106213 * r106214;
double r106216 = r106212 - r106215;
double r106217 = pow(r106216, r106205);
double r106218 = cos(r106206);
double r106219 = cos(r106209);
double r106220 = r106218 * r106219;
double r106221 = lambda1;
double r106222 = lambda2;
double r106223 = r106221 - r106222;
double r106224 = r106223 / r106205;
double r106225 = sin(r106224);
double r106226 = r106220 * r106225;
double r106227 = r106226 * r106225;
double r106228 = r106217 + r106227;
double r106229 = sqrt(r106228);
double r106230 = 1.0;
double r106231 = expm1(r106225);
double r106232 = log1p(r106231);
double r106233 = r106220 * r106232;
double r106234 = 3.0;
double r106235 = pow(r106225, r106234);
double r106236 = cbrt(r106235);
double r106237 = r106233 * r106236;
double r106238 = r106217 + r106237;
double r106239 = r106230 - r106238;
double r106240 = sqrt(r106239);
double r106241 = atan2(r106229, r106240);
double r106242 = r106205 * r106241;
double r106243 = r106204 * r106242;
return r106243;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied div-sub24.6
Applied sin-diff24.0
rmApplied div-sub24.0
Applied sin-diff14.3
rmApplied log1p-expm1-u14.3
rmApplied add-cbrt-cube14.3
Simplified14.3
Final simplification14.3
herbie shell --seed 2020056 +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))))))))))