x + \frac{y \cdot \left(\left(z \cdot 0.0692910599291888946 + 0.49173176105059679\right) \cdot z + 0.279195317918524977\right)}{\left(z + 6.0124592597641033\right) \cdot z + 3.35034381502230394}\begin{array}{l}
\mathbf{if}\;z \le -2.03846987469645444 \cdot 10^{39} \lor \neg \left(z \le 195069351.271798879\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{0.07512208616047561}{z}, y, \mathsf{fma}\left(y, 0.0692910599291888946, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.0692910599291888946, 0.49173176105059679\right), z, 0.279195317918524977\right)}{\frac{\mathsf{fma}\left(z + 6.0124592597641033, z, 3.35034381502230394\right)}{y}} + x\\
\end{array}double f(double x, double y, double z) {
double r313863 = x;
double r313864 = y;
double r313865 = z;
double r313866 = 0.0692910599291889;
double r313867 = r313865 * r313866;
double r313868 = 0.4917317610505968;
double r313869 = r313867 + r313868;
double r313870 = r313869 * r313865;
double r313871 = 0.279195317918525;
double r313872 = r313870 + r313871;
double r313873 = r313864 * r313872;
double r313874 = 6.012459259764103;
double r313875 = r313865 + r313874;
double r313876 = r313875 * r313865;
double r313877 = 3.350343815022304;
double r313878 = r313876 + r313877;
double r313879 = r313873 / r313878;
double r313880 = r313863 + r313879;
return r313880;
}
double f(double x, double y, double z) {
double r313881 = z;
double r313882 = -2.0384698746964544e+39;
bool r313883 = r313881 <= r313882;
double r313884 = 195069351.27179888;
bool r313885 = r313881 <= r313884;
double r313886 = !r313885;
bool r313887 = r313883 || r313886;
double r313888 = 0.07512208616047561;
double r313889 = r313888 / r313881;
double r313890 = y;
double r313891 = 0.0692910599291889;
double r313892 = x;
double r313893 = fma(r313890, r313891, r313892);
double r313894 = fma(r313889, r313890, r313893);
double r313895 = 0.4917317610505968;
double r313896 = fma(r313881, r313891, r313895);
double r313897 = 0.279195317918525;
double r313898 = fma(r313896, r313881, r313897);
double r313899 = 6.012459259764103;
double r313900 = r313881 + r313899;
double r313901 = 3.350343815022304;
double r313902 = fma(r313900, r313881, r313901);
double r313903 = r313902 / r313890;
double r313904 = r313898 / r313903;
double r313905 = r313904 + r313892;
double r313906 = r313887 ? r313894 : r313905;
return r313906;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.5 |
|---|---|
| Target | 0.2 |
| Herbie | 0.1 |
if z < -2.0384698746964544e+39 or 195069351.27179888 < z Initial program 43.7
Simplified35.7
Taylor expanded around inf 0.0
Simplified0.0
if -2.0384698746964544e+39 < z < 195069351.27179888Initial program 0.5
Simplified0.2
rmApplied add-cube-cbrt0.5
Applied associate-/r*0.3
rmApplied fma-udef0.3
Simplified0.2
Final simplification0.1
herbie shell --seed 2020018 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:logGamma from math-functions-0.1.5.2, B"
:precision binary64
:herbie-target
(if (< z -8120153.652456675) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291889) y) (- (/ (* 0.40462203869992125 y) (* z z)) x)) (if (< z 657611897278737680000) (+ x (* (* y (+ (* (+ (* z 0.0692910599291889) 0.4917317610505968) z) 0.279195317918525)) (/ 1 (+ (* (+ z 6.012459259764103) z) 3.350343815022304)))) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291889) y) (- (/ (* 0.40462203869992125 y) (* z z)) x))))
(+ x (/ (* y (+ (* (+ (* z 0.0692910599291889) 0.4917317610505968) z) 0.279195317918525)) (+ (* (+ z 6.012459259764103) z) 3.350343815022304))))