x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.130605476229999961645944495103321969509 + 11.16675412620000074070958362426608800888\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.2346874069999991263557603815570473671\right) \cdot z + 31.46901157490000144889563671313226222992\right) \cdot z + 11.94009057210000079862766142468899488449\right) \cdot z + 0.6077713877710000378584709324059076607227}\begin{array}{l}
\mathbf{if}\;z \le -1.72227048745086914677454525931351178413 \cdot 10^{48} \lor \neg \left(z \le 240528713233231009630516822165946368\right):\\
\;\;\;\;\mathsf{fma}\left(y, 3.130605476229999961645944495103321969509 + \frac{t}{{z}^{2}}, x\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(y \cdot \left(\sqrt{\frac{1}{\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(z + 15.2346874069999991263557603815570473671, z, 31.46901157490000144889563671313226222992\right), z, 11.94009057210000079862766142468899488449\right), z, 0.6077713877710000378584709324059076607227\right)}} \cdot \sqrt{\frac{1}{\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(z + 15.2346874069999991263557603815570473671, z, 31.46901157490000144889563671313226222992\right), z, 11.94009057210000079862766142468899488449\right), z, 0.6077713877710000378584709324059076607227\right)}}\right), \mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(z, 3.130605476229999961645944495103321969509, 11.16675412620000074070958362426608800888\right), z, t\right), z, a\right), z, b\right), x\right)\\
\end{array}double f(double x, double y, double z, double t, double a, double b) {
double r325338 = x;
double r325339 = y;
double r325340 = z;
double r325341 = 3.13060547623;
double r325342 = r325340 * r325341;
double r325343 = 11.1667541262;
double r325344 = r325342 + r325343;
double r325345 = r325344 * r325340;
double r325346 = t;
double r325347 = r325345 + r325346;
double r325348 = r325347 * r325340;
double r325349 = a;
double r325350 = r325348 + r325349;
double r325351 = r325350 * r325340;
double r325352 = b;
double r325353 = r325351 + r325352;
double r325354 = r325339 * r325353;
double r325355 = 15.234687407;
double r325356 = r325340 + r325355;
double r325357 = r325356 * r325340;
double r325358 = 31.4690115749;
double r325359 = r325357 + r325358;
double r325360 = r325359 * r325340;
double r325361 = 11.9400905721;
double r325362 = r325360 + r325361;
double r325363 = r325362 * r325340;
double r325364 = 0.607771387771;
double r325365 = r325363 + r325364;
double r325366 = r325354 / r325365;
double r325367 = r325338 + r325366;
return r325367;
}
double f(double x, double y, double z, double t, double a, double b) {
double r325368 = z;
double r325369 = -1.722270487450869e+48;
bool r325370 = r325368 <= r325369;
double r325371 = 2.40528713233231e+35;
bool r325372 = r325368 <= r325371;
double r325373 = !r325372;
bool r325374 = r325370 || r325373;
double r325375 = y;
double r325376 = 3.13060547623;
double r325377 = t;
double r325378 = 2.0;
double r325379 = pow(r325368, r325378);
double r325380 = r325377 / r325379;
double r325381 = r325376 + r325380;
double r325382 = x;
double r325383 = fma(r325375, r325381, r325382);
double r325384 = 1.0;
double r325385 = 15.234687407;
double r325386 = r325368 + r325385;
double r325387 = 31.4690115749;
double r325388 = fma(r325386, r325368, r325387);
double r325389 = 11.9400905721;
double r325390 = fma(r325388, r325368, r325389);
double r325391 = 0.607771387771;
double r325392 = fma(r325390, r325368, r325391);
double r325393 = r325384 / r325392;
double r325394 = sqrt(r325393);
double r325395 = r325394 * r325394;
double r325396 = r325375 * r325395;
double r325397 = 11.1667541262;
double r325398 = fma(r325368, r325376, r325397);
double r325399 = fma(r325398, r325368, r325377);
double r325400 = a;
double r325401 = fma(r325399, r325368, r325400);
double r325402 = b;
double r325403 = fma(r325401, r325368, r325402);
double r325404 = fma(r325396, r325403, r325382);
double r325405 = r325374 ? r325383 : r325404;
return r325405;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t




Bits error versus a




Bits error versus b
| Original | 29.6 |
|---|---|
| Target | 1.0 |
| Herbie | 1.2 |
if z < -1.722270487450869e+48 or 2.40528713233231e+35 < z Initial program 60.3
Simplified58.1
Taylor expanded around inf 8.7
Simplified1.4
if -1.722270487450869e+48 < z < 2.40528713233231e+35Initial program 1.8
Simplified0.9
rmApplied div-inv1.0
rmApplied add-sqr-sqrt1.1
Final simplification1.2
herbie shell --seed 2020001 +o rules:numerics
(FPCore (x y z t a b)
:name "Numeric.SpecFunctions:logGamma from math-functions-0.1.5.2, D"
:precision binary64
:herbie-target
(if (< z -6.499344996252632e+53) (+ x (* (+ (- 3.13060547623 (/ 36.527041698806414 z)) (/ t (* z z))) (/ y 1))) (if (< z 7.066965436914287e+59) (+ x (/ y (/ (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771) (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)))) (+ x (* (+ (- 3.13060547623 (/ 36.527041698806414 z)) (/ t (* z z))) (/ y 1)))))
(+ x (/ (* y (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)) (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771))))