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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}}{\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 \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r63084 = R;
double r63085 = 2.0;
double r63086 = phi1;
double r63087 = phi2;
double r63088 = r63086 - r63087;
double r63089 = r63088 / r63085;
double r63090 = sin(r63089);
double r63091 = pow(r63090, r63085);
double r63092 = cos(r63086);
double r63093 = cos(r63087);
double r63094 = r63092 * r63093;
double r63095 = lambda1;
double r63096 = lambda2;
double r63097 = r63095 - r63096;
double r63098 = r63097 / r63085;
double r63099 = sin(r63098);
double r63100 = r63094 * r63099;
double r63101 = r63100 * r63099;
double r63102 = r63091 + r63101;
double r63103 = sqrt(r63102);
double r63104 = 1.0;
double r63105 = r63104 - r63102;
double r63106 = sqrt(r63105);
double r63107 = atan2(r63103, r63106);
double r63108 = r63085 * r63107;
double r63109 = r63084 * r63108;
return r63109;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r63110 = R;
double r63111 = 2.0;
double r63112 = phi1;
double r63113 = phi2;
double r63114 = r63112 - r63113;
double r63115 = r63114 / r63111;
double r63116 = sin(r63115);
double r63117 = pow(r63116, r63111);
double r63118 = cos(r63112);
double r63119 = cos(r63113);
double r63120 = r63118 * r63119;
double r63121 = lambda1;
double r63122 = lambda2;
double r63123 = r63121 - r63122;
double r63124 = r63123 / r63111;
double r63125 = sin(r63124);
double r63126 = r63120 * r63125;
double r63127 = 3.0;
double r63128 = pow(r63125, r63127);
double r63129 = cbrt(r63128);
double r63130 = r63126 * r63129;
double r63131 = r63117 + r63130;
double r63132 = sqrt(r63131);
double r63133 = 1.0;
double r63134 = exp(r63125);
double r63135 = log(r63134);
double r63136 = r63120 * r63135;
double r63137 = r63136 * r63125;
double r63138 = r63117 + r63137;
double r63139 = r63133 - r63138;
double r63140 = sqrt(r63139);
double r63141 = atan2(r63132, r63140);
double r63142 = r63111 * r63141;
double r63143 = r63110 * r63142;
return r63143;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.5
rmApplied add-log-exp24.6
rmApplied add-cbrt-cube24.8
Simplified24.8
Final simplification24.8
herbie shell --seed 2019209
(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))))))))))