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 \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 r82096 = R;
double r82097 = 2.0;
double r82098 = phi1;
double r82099 = phi2;
double r82100 = r82098 - r82099;
double r82101 = r82100 / r82097;
double r82102 = sin(r82101);
double r82103 = pow(r82102, r82097);
double r82104 = cos(r82098);
double r82105 = cos(r82099);
double r82106 = r82104 * r82105;
double r82107 = lambda1;
double r82108 = lambda2;
double r82109 = r82107 - r82108;
double r82110 = r82109 / r82097;
double r82111 = sin(r82110);
double r82112 = r82106 * r82111;
double r82113 = r82112 * r82111;
double r82114 = r82103 + r82113;
double r82115 = sqrt(r82114);
double r82116 = 1.0;
double r82117 = r82116 - r82114;
double r82118 = sqrt(r82117);
double r82119 = atan2(r82115, r82118);
double r82120 = r82097 * r82119;
double r82121 = r82096 * r82120;
return r82121;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r82122 = R;
double r82123 = 2.0;
double r82124 = phi1;
double r82125 = r82124 / r82123;
double r82126 = sin(r82125);
double r82127 = phi2;
double r82128 = r82127 / r82123;
double r82129 = cos(r82128);
double r82130 = r82126 * r82129;
double r82131 = cos(r82125);
double r82132 = sin(r82128);
double r82133 = r82131 * r82132;
double r82134 = r82130 - r82133;
double r82135 = pow(r82134, r82123);
double r82136 = cos(r82124);
double r82137 = cos(r82127);
double r82138 = r82136 * r82137;
double r82139 = lambda1;
double r82140 = lambda2;
double r82141 = r82139 - r82140;
double r82142 = r82141 / r82123;
double r82143 = sin(r82142);
double r82144 = r82138 * r82143;
double r82145 = r82144 * r82143;
double r82146 = r82135 + r82145;
double r82147 = sqrt(r82146);
double r82148 = 1.0;
double r82149 = exp(r82143);
double r82150 = log(r82149);
double r82151 = r82138 * r82150;
double r82152 = 3.0;
double r82153 = pow(r82143, r82152);
double r82154 = cbrt(r82153);
double r82155 = r82151 * r82154;
double r82156 = r82135 + r82155;
double r82157 = r82148 - r82156;
double r82158 = sqrt(r82157);
double r82159 = atan2(r82147, r82158);
double r82160 = r82123 * r82159;
double r82161 = r82122 * r82160;
return r82161;
}



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.8
rmApplied div-sub23.8
Applied sin-diff14.1
rmApplied add-log-exp14.2
rmApplied add-cbrt-cube14.2
Simplified14.2
Final simplification14.2
herbie shell --seed 2019305
(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))))))))))