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 -123702675580259303424 \lor \neg \left(z \le 0.02992000358306671353725292306080518756062\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{z}, 0.07512208616047560960637952121032867580652, \mathsf{fma}\left(y, 0.06929105992918889456166908757950295694172, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\mathsf{fma}\left(\mathsf{fma}\left(0.06929105992918889456166908757950295694172, z, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right)}{\mathsf{fma}\left(6.012459259764103336465268512256443500519 + z, z, 3.350343815022303939343828460550867021084\right)}, y, x\right)\\
\end{array}double f(double x, double y, double z) {
double r235153 = x;
double r235154 = y;
double r235155 = z;
double r235156 = 0.0692910599291889;
double r235157 = r235155 * r235156;
double r235158 = 0.4917317610505968;
double r235159 = r235157 + r235158;
double r235160 = r235159 * r235155;
double r235161 = 0.279195317918525;
double r235162 = r235160 + r235161;
double r235163 = r235154 * r235162;
double r235164 = 6.012459259764103;
double r235165 = r235155 + r235164;
double r235166 = r235165 * r235155;
double r235167 = 3.350343815022304;
double r235168 = r235166 + r235167;
double r235169 = r235163 / r235168;
double r235170 = r235153 + r235169;
return r235170;
}
double f(double x, double y, double z) {
double r235171 = z;
double r235172 = -1.237026755802593e+20;
bool r235173 = r235171 <= r235172;
double r235174 = 0.029920003583066714;
bool r235175 = r235171 <= r235174;
double r235176 = !r235175;
bool r235177 = r235173 || r235176;
double r235178 = y;
double r235179 = r235178 / r235171;
double r235180 = 0.07512208616047561;
double r235181 = 0.0692910599291889;
double r235182 = x;
double r235183 = fma(r235178, r235181, r235182);
double r235184 = fma(r235179, r235180, r235183);
double r235185 = 0.4917317610505968;
double r235186 = fma(r235181, r235171, r235185);
double r235187 = 0.279195317918525;
double r235188 = fma(r235186, r235171, r235187);
double r235189 = 6.012459259764103;
double r235190 = r235189 + r235171;
double r235191 = 3.350343815022304;
double r235192 = fma(r235190, r235171, r235191);
double r235193 = r235188 / r235192;
double r235194 = fma(r235193, r235178, r235182);
double r235195 = r235177 ? r235184 : r235194;
return r235195;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.0 |
|---|---|
| Target | 0.2 |
| Herbie | 0.2 |
if z < -1.237026755802593e+20 or 0.029920003583066714 < z Initial program 41.4
Taylor expanded around inf 0.3
Simplified0.3
if -1.237026755802593e+20 < z < 0.029920003583066714Initial program 0.2
Simplified0.1
Taylor expanded around 0 0.1
Simplified0.1
Final simplification0.2
herbie shell --seed 2019179 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:logGamma from math-functions-0.1.5.2, B"
:herbie-target
(if (< z -8120153.652456675) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291889) y) (- (/ (* 0.40462203869992125 y) (* z z)) x)) (if (< z 6.576118972787377e+20) (+ x (* (* y (+ (* (+ (* z 0.0692910599291889) 0.4917317610505968) z) 0.279195317918525)) (/ 1.0 (+ (* (+ 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))))