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 -1766059654986.306884765625:\\
\;\;\;\;\mathsf{fma}\left(\frac{0.07512208616047560960637952121032867580652}{z}, y, \mathsf{fma}\left(y, 0.06929105992918889456166908757950295694172, x\right)\right)\\
\mathbf{elif}\;z \le 9.349284559663863576071788271886616134097 \cdot 10^{-13}:\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{\mathsf{fma}\left(z, 6.012459259764103336465268512256443500519, \mathsf{fma}\left(z, z, 3.350343815022303939343828460550867021084\right)\right)}, \mathsf{fma}\left(\mathsf{fma}\left(z, 0.06929105992918889456166908757950295694172, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right), x\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(0.07512208616047560960637952121032867580652, \frac{y}{z}, 0.06929105992918889456166908757950295694172 \cdot y - 0.4046220386999212492717958866705885156989 \cdot \frac{y}{{z}^{2}}\right) + x\\
\end{array}double f(double x, double y, double z) {
double r398380 = x;
double r398381 = y;
double r398382 = z;
double r398383 = 0.0692910599291889;
double r398384 = r398382 * r398383;
double r398385 = 0.4917317610505968;
double r398386 = r398384 + r398385;
double r398387 = r398386 * r398382;
double r398388 = 0.279195317918525;
double r398389 = r398387 + r398388;
double r398390 = r398381 * r398389;
double r398391 = 6.012459259764103;
double r398392 = r398382 + r398391;
double r398393 = r398392 * r398382;
double r398394 = 3.350343815022304;
double r398395 = r398393 + r398394;
double r398396 = r398390 / r398395;
double r398397 = r398380 + r398396;
return r398397;
}
double f(double x, double y, double z) {
double r398398 = z;
double r398399 = -1766059654986.307;
bool r398400 = r398398 <= r398399;
double r398401 = 0.07512208616047561;
double r398402 = r398401 / r398398;
double r398403 = y;
double r398404 = 0.0692910599291889;
double r398405 = x;
double r398406 = fma(r398403, r398404, r398405);
double r398407 = fma(r398402, r398403, r398406);
double r398408 = 9.349284559663864e-13;
bool r398409 = r398398 <= r398408;
double r398410 = 6.012459259764103;
double r398411 = 3.350343815022304;
double r398412 = fma(r398398, r398398, r398411);
double r398413 = fma(r398398, r398410, r398412);
double r398414 = r398403 / r398413;
double r398415 = 0.4917317610505968;
double r398416 = fma(r398398, r398404, r398415);
double r398417 = 0.279195317918525;
double r398418 = fma(r398416, r398398, r398417);
double r398419 = fma(r398414, r398418, r398405);
double r398420 = r398403 / r398398;
double r398421 = r398404 * r398403;
double r398422 = 0.40462203869992125;
double r398423 = 2.0;
double r398424 = pow(r398398, r398423);
double r398425 = r398403 / r398424;
double r398426 = r398422 * r398425;
double r398427 = r398421 - r398426;
double r398428 = fma(r398401, r398420, r398427);
double r398429 = r398428 + r398405;
double r398430 = r398409 ? r398419 : r398429;
double r398431 = r398400 ? r398407 : r398430;
return r398431;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.5 |
|---|---|
| Target | 0.2 |
| Herbie | 0.5 |
if z < -1766059654986.307Initial program 41.8
Simplified35.0
Taylor expanded around inf 0.0
Simplified0.0
if -1766059654986.307 < z < 9.349284559663864e-13Initial program 0.2
Simplified0.1
Taylor expanded around 0 0.1
Simplified0.1
if 9.349284559663864e-13 < z Initial program 38.9
Simplified32.9
Taylor expanded around 0 32.9
Simplified32.9
rmApplied clear-num32.9
rmApplied fma-udef32.9
Simplified32.9
Taylor expanded around inf 1.5
Simplified1.5
Final simplification0.5
herbie shell --seed 2020002 +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))))