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 \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 \sqrt[3]{{\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)\right)\right)}^{3}}\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 r104127 = R;
double r104128 = 2.0;
double r104129 = phi1;
double r104130 = phi2;
double r104131 = r104129 - r104130;
double r104132 = r104131 / r104128;
double r104133 = sin(r104132);
double r104134 = pow(r104133, r104128);
double r104135 = cos(r104129);
double r104136 = cos(r104130);
double r104137 = r104135 * r104136;
double r104138 = lambda1;
double r104139 = lambda2;
double r104140 = r104138 - r104139;
double r104141 = r104140 / r104128;
double r104142 = sin(r104141);
double r104143 = r104137 * r104142;
double r104144 = r104143 * r104142;
double r104145 = r104134 + r104144;
double r104146 = sqrt(r104145);
double r104147 = 1.0;
double r104148 = r104147 - r104145;
double r104149 = sqrt(r104148);
double r104150 = atan2(r104146, r104149);
double r104151 = r104128 * r104150;
double r104152 = r104127 * r104151;
return r104152;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104153 = R;
double r104154 = 2.0;
double r104155 = phi1;
double r104156 = phi2;
double r104157 = r104155 - r104156;
double r104158 = r104157 / r104154;
double r104159 = sin(r104158);
double r104160 = pow(r104159, r104154);
double r104161 = cos(r104155);
double r104162 = cos(r104156);
double r104163 = r104161 * r104162;
double r104164 = lambda1;
double r104165 = lambda2;
double r104166 = r104164 - r104165;
double r104167 = r104166 / r104154;
double r104168 = sin(r104167);
double r104169 = r104163 * r104168;
double r104170 = r104169 * r104168;
double r104171 = r104160 + r104170;
double r104172 = sqrt(r104171);
double r104173 = 1.0;
double r104174 = exp(r104168);
double r104175 = log(r104174);
double r104176 = log1p(r104175);
double r104177 = expm1(r104176);
double r104178 = 3.0;
double r104179 = pow(r104177, r104178);
double r104180 = cbrt(r104179);
double r104181 = r104163 * r104180;
double r104182 = pow(r104168, r104178);
double r104183 = cbrt(r104182);
double r104184 = r104181 * r104183;
double r104185 = r104160 + r104184;
double r104186 = r104173 - r104185;
double r104187 = sqrt(r104186);
double r104188 = atan2(r104172, r104187);
double r104189 = r104154 * r104188;
double r104190 = r104153 * r104189;
return r104190;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 25.1
rmApplied add-cbrt-cube25.1
Simplified25.1
rmApplied add-cbrt-cube25.1
Simplified25.1
rmApplied expm1-log1p-u25.1
rmApplied add-log-exp25.1
Final simplification25.1
herbie shell --seed 2019354 +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))))))))))