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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}}{\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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\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 r68153 = R;
double r68154 = 2.0;
double r68155 = phi1;
double r68156 = phi2;
double r68157 = r68155 - r68156;
double r68158 = r68157 / r68154;
double r68159 = sin(r68158);
double r68160 = pow(r68159, r68154);
double r68161 = cos(r68155);
double r68162 = cos(r68156);
double r68163 = r68161 * r68162;
double r68164 = lambda1;
double r68165 = lambda2;
double r68166 = r68164 - r68165;
double r68167 = r68166 / r68154;
double r68168 = sin(r68167);
double r68169 = r68163 * r68168;
double r68170 = r68169 * r68168;
double r68171 = r68160 + r68170;
double r68172 = sqrt(r68171);
double r68173 = 1.0;
double r68174 = r68173 - r68171;
double r68175 = sqrt(r68174);
double r68176 = atan2(r68172, r68175);
double r68177 = r68154 * r68176;
double r68178 = r68153 * r68177;
return r68178;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68179 = R;
double r68180 = 2.0;
double r68181 = phi1;
double r68182 = r68181 / r68180;
double r68183 = sin(r68182);
double r68184 = phi2;
double r68185 = r68184 / r68180;
double r68186 = cos(r68185);
double r68187 = r68183 * r68186;
double r68188 = cos(r68182);
double r68189 = sin(r68185);
double r68190 = r68188 * r68189;
double r68191 = r68187 - r68190;
double r68192 = pow(r68191, r68180);
double r68193 = cos(r68181);
double r68194 = cos(r68184);
double r68195 = r68193 * r68194;
double r68196 = lambda1;
double r68197 = lambda2;
double r68198 = r68196 - r68197;
double r68199 = r68198 / r68180;
double r68200 = sin(r68199);
double r68201 = r68195 * r68200;
double r68202 = 3.0;
double r68203 = pow(r68200, r68202);
double r68204 = cbrt(r68203);
double r68205 = r68201 * r68204;
double r68206 = r68192 + r68205;
double r68207 = sqrt(r68206);
double r68208 = 1.0;
double r68209 = r68208 - r68206;
double r68210 = sqrt(r68209);
double r68211 = atan2(r68207, r68210);
double r68212 = r68180 * r68211;
double r68213 = r68179 * r68212;
return r68213;
}



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.1
rmApplied div-sub24.1
Applied sin-diff13.9
rmApplied add-cbrt-cube14.1
Simplified14.1
rmApplied add-cbrt-cube14.1
Simplified14.1
Final simplification14.1
herbie shell --seed 2020034
(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))))))))))