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 -897232587.50048161 \lor \neg \left(z \le 72489.2439122225187\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{0.07512208616047561}{z}, y, \mathsf{fma}\left(y, 0.0692910599291888946, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{\mathsf{fma}\left(z + 6.0124592597641033, z, 3.35034381502230394\right)}, \mathsf{fma}\left(\mathsf{fma}\left(z, 0.0692910599291888946, 0.49173176105059679\right), z, 0.279195317918524977\right), x\right)\\
\end{array}double f(double x, double y, double z) {
double r328255 = x;
double r328256 = y;
double r328257 = z;
double r328258 = 0.0692910599291889;
double r328259 = r328257 * r328258;
double r328260 = 0.4917317610505968;
double r328261 = r328259 + r328260;
double r328262 = r328261 * r328257;
double r328263 = 0.279195317918525;
double r328264 = r328262 + r328263;
double r328265 = r328256 * r328264;
double r328266 = 6.012459259764103;
double r328267 = r328257 + r328266;
double r328268 = r328267 * r328257;
double r328269 = 3.350343815022304;
double r328270 = r328268 + r328269;
double r328271 = r328265 / r328270;
double r328272 = r328255 + r328271;
return r328272;
}
double f(double x, double y, double z) {
double r328273 = z;
double r328274 = -897232587.5004816;
bool r328275 = r328273 <= r328274;
double r328276 = 72489.24391222252;
bool r328277 = r328273 <= r328276;
double r328278 = !r328277;
bool r328279 = r328275 || r328278;
double r328280 = 0.07512208616047561;
double r328281 = r328280 / r328273;
double r328282 = y;
double r328283 = 0.0692910599291889;
double r328284 = x;
double r328285 = fma(r328282, r328283, r328284);
double r328286 = fma(r328281, r328282, r328285);
double r328287 = 6.012459259764103;
double r328288 = r328273 + r328287;
double r328289 = 3.350343815022304;
double r328290 = fma(r328288, r328273, r328289);
double r328291 = r328282 / r328290;
double r328292 = 0.4917317610505968;
double r328293 = fma(r328273, r328283, r328292);
double r328294 = 0.279195317918525;
double r328295 = fma(r328293, r328273, r328294);
double r328296 = fma(r328291, r328295, r328284);
double r328297 = r328279 ? r328286 : r328296;
return r328297;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.3 |
|---|---|
| Target | 0.1 |
| Herbie | 0.1 |
if z < -897232587.5004816 or 72489.24391222252 < z Initial program 41.2
Simplified34.3
rmApplied add-sqr-sqrt34.3
Applied associate-/r*34.3
rmApplied add-cube-cbrt34.5
Applied add-cube-cbrt34.6
Applied *-un-lft-identity34.6
Applied times-frac34.6
Applied times-frac34.6
Simplified34.6
Simplified34.6
Taylor expanded around inf 0.0
Simplified0.0
if -897232587.5004816 < z < 72489.24391222252Initial program 0.2
Simplified0.1
Final simplification0.1
herbie shell --seed 2020046 +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))))