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 \log \left(e^{\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}\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 r92113 = R;
double r92114 = 2.0;
double r92115 = phi1;
double r92116 = phi2;
double r92117 = r92115 - r92116;
double r92118 = r92117 / r92114;
double r92119 = sin(r92118);
double r92120 = pow(r92119, r92114);
double r92121 = cos(r92115);
double r92122 = cos(r92116);
double r92123 = r92121 * r92122;
double r92124 = lambda1;
double r92125 = lambda2;
double r92126 = r92124 - r92125;
double r92127 = r92126 / r92114;
double r92128 = sin(r92127);
double r92129 = r92123 * r92128;
double r92130 = r92129 * r92128;
double r92131 = r92120 + r92130;
double r92132 = sqrt(r92131);
double r92133 = 1.0;
double r92134 = r92133 - r92131;
double r92135 = sqrt(r92134);
double r92136 = atan2(r92132, r92135);
double r92137 = r92114 * r92136;
double r92138 = r92113 * r92137;
return r92138;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r92139 = R;
double r92140 = 2.0;
double r92141 = phi1;
double r92142 = phi2;
double r92143 = r92141 - r92142;
double r92144 = r92143 / r92140;
double r92145 = sin(r92144);
double r92146 = pow(r92145, r92140);
double r92147 = cos(r92141);
double r92148 = cos(r92142);
double r92149 = r92147 * r92148;
double r92150 = lambda1;
double r92151 = lambda2;
double r92152 = r92150 - r92151;
double r92153 = r92152 / r92140;
double r92154 = sin(r92153);
double r92155 = r92149 * r92154;
double r92156 = r92155 * r92154;
double r92157 = r92146 + r92156;
double r92158 = sqrt(r92157);
double r92159 = 1.0;
double r92160 = 3.0;
double r92161 = pow(r92154, r92160);
double r92162 = cbrt(r92161);
double r92163 = exp(r92162);
double r92164 = log(r92163);
double r92165 = r92149 * r92164;
double r92166 = r92165 * r92162;
double r92167 = r92146 + r92166;
double r92168 = r92159 - r92167;
double r92169 = sqrt(r92168);
double r92170 = atan2(r92158, r92169);
double r92171 = r92140 * r92170;
double r92172 = r92139 * r92171;
return r92172;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.2
rmApplied add-log-exp24.2
rmApplied add-cbrt-cube24.2
Simplified24.2
rmApplied add-cbrt-cube24.3
Simplified24.3
Final simplification24.3
herbie shell --seed 2020035
(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))))))))))