x + \frac{y \cdot \left(\left(z \cdot 0.06929105992918889456166908757950295694172 + 0.4917317610505967939715787906607147306204\right) \cdot z + 0.2791953179185249767080279070796677842736\right)}{\left(z + 6.012459259764103336465268512256443500519\right) \cdot z + 3.350343815022303939343828460550867021084}\begin{array}{l}
\mathbf{if}\;z \le -0.6121835230050514109478854152257554233074 \lor \neg \left(z \le 125942949.1297363936901092529296875\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{z}, 0.07512208616047560960637952121032867580652, \mathsf{fma}\left(0.06929105992918889456166908757950295694172, y, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{\mathsf{fma}\left(z + 6.012459259764103336465268512256443500519, z, 3.350343815022303939343828460550867021084\right)}, \left(\sqrt[3]{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.06929105992918889456166908757950295694172, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right)} \cdot \sqrt[3]{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.06929105992918889456166908757950295694172, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right)}\right) \cdot e^{\log \left(\sqrt[3]{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.06929105992918889456166908757950295694172, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right)}\right)}, x\right)\\
\end{array}double f(double x, double y, double z) {
double r245854 = x;
double r245855 = y;
double r245856 = z;
double r245857 = 0.0692910599291889;
double r245858 = r245856 * r245857;
double r245859 = 0.4917317610505968;
double r245860 = r245858 + r245859;
double r245861 = r245860 * r245856;
double r245862 = 0.279195317918525;
double r245863 = r245861 + r245862;
double r245864 = r245855 * r245863;
double r245865 = 6.012459259764103;
double r245866 = r245856 + r245865;
double r245867 = r245866 * r245856;
double r245868 = 3.350343815022304;
double r245869 = r245867 + r245868;
double r245870 = r245864 / r245869;
double r245871 = r245854 + r245870;
return r245871;
}
double f(double x, double y, double z) {
double r245872 = z;
double r245873 = -0.6121835230050514;
bool r245874 = r245872 <= r245873;
double r245875 = 125942949.1297364;
bool r245876 = r245872 <= r245875;
double r245877 = !r245876;
bool r245878 = r245874 || r245877;
double r245879 = y;
double r245880 = r245879 / r245872;
double r245881 = 0.07512208616047561;
double r245882 = 0.0692910599291889;
double r245883 = x;
double r245884 = fma(r245882, r245879, r245883);
double r245885 = fma(r245880, r245881, r245884);
double r245886 = 6.012459259764103;
double r245887 = r245872 + r245886;
double r245888 = 3.350343815022304;
double r245889 = fma(r245887, r245872, r245888);
double r245890 = r245879 / r245889;
double r245891 = 0.4917317610505968;
double r245892 = fma(r245872, r245882, r245891);
double r245893 = 0.279195317918525;
double r245894 = fma(r245892, r245872, r245893);
double r245895 = cbrt(r245894);
double r245896 = r245895 * r245895;
double r245897 = log(r245895);
double r245898 = exp(r245897);
double r245899 = r245896 * r245898;
double r245900 = fma(r245890, r245899, r245883);
double r245901 = r245878 ? r245885 : r245900;
return r245901;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.3 |
|---|---|
| Target | 0.1 |
| Herbie | 0.2 |
if z < -0.6121835230050514 or 125942949.1297364 < z Initial program 40.8
Simplified33.8
rmApplied add-sqr-sqrt33.9
Applied associate-/r*33.9
Taylor expanded around inf 0.2
Simplified0.2
if -0.6121835230050514 < z < 125942949.1297364Initial program 0.1
Simplified0.1
rmApplied add-cube-cbrt0.2
rmApplied add-exp-log0.2
Final simplification0.2
herbie shell --seed 2019303 +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.6524566747) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291888946) y) (- (/ (* 0.404622038699921249 y) (* z z)) x)) (if (< z 657611897278737680000) (+ x (* (* y (+ (* (+ (* z 0.0692910599291888946) 0.49173176105059679) z) 0.279195317918524977)) (/ 1 (+ (* (+ z 6.0124592597641033) z) 3.35034381502230394)))) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291888946) y) (- (/ (* 0.404622038699921249 y) (* z z)) x))))
(+ x (/ (* y (+ (* (+ (* z 0.0692910599291888946) 0.49173176105059679) z) 0.279195317918524977)) (+ (* (+ z 6.0124592597641033) z) 3.35034381502230394))))