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 -2642213428.445613861083984375 \lor \neg \left(z \le 629.3033712948589482039096765220165252686\right):\\
\;\;\;\;\mathsf{fma}\left(0.06929105992918889456166908757950295694172, y, \mathsf{fma}\left(\frac{y}{z}, 0.07512208616047560960637952121032867580652, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;x + y \cdot \frac{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.06929105992918889456166908757950295694172, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right)}{\mathsf{fma}\left(z + 6.012459259764103336465268512256443500519, z, 3.350343815022303939343828460550867021084\right)}\\
\end{array}double f(double x, double y, double z) {
double r195323 = x;
double r195324 = y;
double r195325 = z;
double r195326 = 0.0692910599291889;
double r195327 = r195325 * r195326;
double r195328 = 0.4917317610505968;
double r195329 = r195327 + r195328;
double r195330 = r195329 * r195325;
double r195331 = 0.279195317918525;
double r195332 = r195330 + r195331;
double r195333 = r195324 * r195332;
double r195334 = 6.012459259764103;
double r195335 = r195325 + r195334;
double r195336 = r195335 * r195325;
double r195337 = 3.350343815022304;
double r195338 = r195336 + r195337;
double r195339 = r195333 / r195338;
double r195340 = r195323 + r195339;
return r195340;
}
double f(double x, double y, double z) {
double r195341 = z;
double r195342 = -2642213428.445614;
bool r195343 = r195341 <= r195342;
double r195344 = 629.303371294859;
bool r195345 = r195341 <= r195344;
double r195346 = !r195345;
bool r195347 = r195343 || r195346;
double r195348 = 0.0692910599291889;
double r195349 = y;
double r195350 = r195349 / r195341;
double r195351 = 0.07512208616047561;
double r195352 = x;
double r195353 = fma(r195350, r195351, r195352);
double r195354 = fma(r195348, r195349, r195353);
double r195355 = 0.4917317610505968;
double r195356 = fma(r195341, r195348, r195355);
double r195357 = 0.279195317918525;
double r195358 = fma(r195356, r195341, r195357);
double r195359 = 6.012459259764103;
double r195360 = r195341 + r195359;
double r195361 = 3.350343815022304;
double r195362 = fma(r195360, r195341, r195361);
double r195363 = r195358 / r195362;
double r195364 = r195349 * r195363;
double r195365 = r195352 + r195364;
double r195366 = r195347 ? r195354 : r195365;
return r195366;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.4 |
|---|---|
| Target | 0.2 |
| Herbie | 0.1 |
if z < -2642213428.445614 or 629.303371294859 < z Initial program 41.0
Simplified34.3
rmApplied add-sqr-sqrt34.3
Applied *-un-lft-identity34.3
Applied times-frac34.3
Taylor expanded around inf 0.1
Simplified0.1
if -2642213428.445614 < z < 629.303371294859Initial program 0.2
rmApplied *-un-lft-identity0.2
Applied times-frac0.1
Simplified0.1
Simplified0.1
Final simplification0.1
herbie shell --seed 2019322 +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))))