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 \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \left(\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r87089 = R;
double r87090 = 2.0;
double r87091 = phi1;
double r87092 = phi2;
double r87093 = r87091 - r87092;
double r87094 = r87093 / r87090;
double r87095 = sin(r87094);
double r87096 = pow(r87095, r87090);
double r87097 = cos(r87091);
double r87098 = cos(r87092);
double r87099 = r87097 * r87098;
double r87100 = lambda1;
double r87101 = lambda2;
double r87102 = r87100 - r87101;
double r87103 = r87102 / r87090;
double r87104 = sin(r87103);
double r87105 = r87099 * r87104;
double r87106 = r87105 * r87104;
double r87107 = r87096 + r87106;
double r87108 = sqrt(r87107);
double r87109 = 1.0;
double r87110 = r87109 - r87107;
double r87111 = sqrt(r87110);
double r87112 = atan2(r87108, r87111);
double r87113 = r87090 * r87112;
double r87114 = r87089 * r87113;
return r87114;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r87115 = R;
double r87116 = 2.0;
double r87117 = phi1;
double r87118 = r87117 / r87116;
double r87119 = sin(r87118);
double r87120 = phi2;
double r87121 = r87120 / r87116;
double r87122 = cos(r87121);
double r87123 = r87119 * r87122;
double r87124 = cos(r87118);
double r87125 = sin(r87121);
double r87126 = r87124 * r87125;
double r87127 = r87123 - r87126;
double r87128 = pow(r87127, r87116);
double r87129 = cos(r87117);
double r87130 = cos(r87120);
double r87131 = r87129 * r87130;
double r87132 = lambda1;
double r87133 = lambda2;
double r87134 = r87132 - r87133;
double r87135 = r87134 / r87116;
double r87136 = sin(r87135);
double r87137 = r87131 * r87136;
double r87138 = r87137 * r87136;
double r87139 = r87128 + r87138;
double r87140 = sqrt(r87139);
double r87141 = 1.0;
double r87142 = exp(r87136);
double r87143 = log(r87142);
double r87144 = r87131 * r87143;
double r87145 = cbrt(r87136);
double r87146 = r87145 * r87145;
double r87147 = r87146 * r87145;
double r87148 = r87144 * r87147;
double r87149 = r87128 + r87148;
double r87150 = r87141 - r87149;
double r87151 = sqrt(r87150);
double r87152 = atan2(r87140, r87151);
double r87153 = r87116 * r87152;
double r87154 = r87115 * r87153;
return r87154;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
rmApplied div-sub24.4
Applied sin-diff23.9
rmApplied div-sub23.9
Applied sin-diff14.3
rmApplied add-log-exp14.3
rmApplied add-cube-cbrt14.4
Final simplification14.4
herbie shell --seed 2020001 +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))))))))))