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.6510917084793137 \cdot 10^{26} \lor \neg \left(z \le 0.200318100483606681\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{z}, 0.07512208616047561, \mathsf{fma}\left(y, 0.0692910599291888946, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;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}\\
\end{array}double f(double x, double y, double z) {
double r400180 = x;
double r400181 = y;
double r400182 = z;
double r400183 = 0.0692910599291889;
double r400184 = r400182 * r400183;
double r400185 = 0.4917317610505968;
double r400186 = r400184 + r400185;
double r400187 = r400186 * r400182;
double r400188 = 0.279195317918525;
double r400189 = r400187 + r400188;
double r400190 = r400181 * r400189;
double r400191 = 6.012459259764103;
double r400192 = r400182 + r400191;
double r400193 = r400192 * r400182;
double r400194 = 3.350343815022304;
double r400195 = r400193 + r400194;
double r400196 = r400190 / r400195;
double r400197 = r400180 + r400196;
return r400197;
}
double f(double x, double y, double z) {
double r400198 = z;
double r400199 = -2.6510917084793137e+26;
bool r400200 = r400198 <= r400199;
double r400201 = 0.20031810048360668;
bool r400202 = r400198 <= r400201;
double r400203 = !r400202;
bool r400204 = r400200 || r400203;
double r400205 = y;
double r400206 = r400205 / r400198;
double r400207 = 0.07512208616047561;
double r400208 = 0.0692910599291889;
double r400209 = x;
double r400210 = fma(r400205, r400208, r400209);
double r400211 = fma(r400206, r400207, r400210);
double r400212 = r400198 * r400208;
double r400213 = 0.4917317610505968;
double r400214 = r400212 + r400213;
double r400215 = r400214 * r400198;
double r400216 = 0.279195317918525;
double r400217 = r400215 + r400216;
double r400218 = r400205 * r400217;
double r400219 = 6.012459259764103;
double r400220 = r400198 + r400219;
double r400221 = r400220 * r400198;
double r400222 = 3.350343815022304;
double r400223 = r400221 + r400222;
double r400224 = r400218 / r400223;
double r400225 = r400209 + r400224;
double r400226 = r400204 ? r400211 : r400225;
return r400226;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 19.8 |
|---|---|
| Target | 0.2 |
| Herbie | 0.3 |
if z < -2.6510917084793137e+26 or 0.20031810048360668 < z Initial program 41.6
Simplified35.0
Taylor expanded around inf 0.3
Simplified0.3
if -2.6510917084793137e+26 < z < 0.20031810048360668Initial program 0.3
Final simplification0.3
herbie shell --seed 2020043 +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))))