\frac{\left(x - 2\right) \cdot \left(\left(\left(\left(x \cdot 4.16438922227999964 + 78.6994924154000017\right) \cdot x + 137.51941641600001\right) \cdot x + y\right) \cdot x + z\right)}{\left(\left(\left(x + 43.3400022514000014\right) \cdot x + 263.50507472100003\right) \cdot x + 313.399215894\right) \cdot x + 47.066876606000001}\begin{array}{l}
\mathbf{if}\;x \le -1.81973586844136588 \cdot 10^{48} \lor \neg \left(x \le 3.1891806251302295 \cdot 10^{39}\right):\\
\;\;\;\;\mathsf{fma}\left(x, 4.16438922227999964, \frac{y}{{x}^{2}} - 110.11392429848109\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\mathsf{log1p}\left(\mathsf{expm1}\left(\frac{x - 2}{\sqrt{\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(x + 43.3400022514000014, x, 263.50507472100003\right), x, 313.399215894\right), x, 47.066876606000001\right)}}\right)\right)}{\frac{\sqrt{\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(x + 43.3400022514000014, x, 263.50507472100003\right), x, 313.399215894\right), x, 47.066876606000001\right)}}{\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(x, 4.16438922227999964, 78.6994924154000017\right), x, 137.51941641600001\right), x, y\right), x, z\right)}}\\
\end{array}double f(double x, double y, double z) {
double r313447 = x;
double r313448 = 2.0;
double r313449 = r313447 - r313448;
double r313450 = 4.16438922228;
double r313451 = r313447 * r313450;
double r313452 = 78.6994924154;
double r313453 = r313451 + r313452;
double r313454 = r313453 * r313447;
double r313455 = 137.519416416;
double r313456 = r313454 + r313455;
double r313457 = r313456 * r313447;
double r313458 = y;
double r313459 = r313457 + r313458;
double r313460 = r313459 * r313447;
double r313461 = z;
double r313462 = r313460 + r313461;
double r313463 = r313449 * r313462;
double r313464 = 43.3400022514;
double r313465 = r313447 + r313464;
double r313466 = r313465 * r313447;
double r313467 = 263.505074721;
double r313468 = r313466 + r313467;
double r313469 = r313468 * r313447;
double r313470 = 313.399215894;
double r313471 = r313469 + r313470;
double r313472 = r313471 * r313447;
double r313473 = 47.066876606;
double r313474 = r313472 + r313473;
double r313475 = r313463 / r313474;
return r313475;
}
double f(double x, double y, double z) {
double r313476 = x;
double r313477 = -1.819735868441366e+48;
bool r313478 = r313476 <= r313477;
double r313479 = 3.1891806251302295e+39;
bool r313480 = r313476 <= r313479;
double r313481 = !r313480;
bool r313482 = r313478 || r313481;
double r313483 = 4.16438922228;
double r313484 = y;
double r313485 = 2.0;
double r313486 = pow(r313476, r313485);
double r313487 = r313484 / r313486;
double r313488 = 110.1139242984811;
double r313489 = r313487 - r313488;
double r313490 = fma(r313476, r313483, r313489);
double r313491 = 2.0;
double r313492 = r313476 - r313491;
double r313493 = 43.3400022514;
double r313494 = r313476 + r313493;
double r313495 = 263.505074721;
double r313496 = fma(r313494, r313476, r313495);
double r313497 = 313.399215894;
double r313498 = fma(r313496, r313476, r313497);
double r313499 = 47.066876606;
double r313500 = fma(r313498, r313476, r313499);
double r313501 = sqrt(r313500);
double r313502 = r313492 / r313501;
double r313503 = expm1(r313502);
double r313504 = log1p(r313503);
double r313505 = 78.6994924154;
double r313506 = fma(r313476, r313483, r313505);
double r313507 = 137.519416416;
double r313508 = fma(r313506, r313476, r313507);
double r313509 = fma(r313508, r313476, r313484);
double r313510 = z;
double r313511 = fma(r313509, r313476, r313510);
double r313512 = r313501 / r313511;
double r313513 = r313504 / r313512;
double r313514 = r313482 ? r313490 : r313513;
return r313514;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 26.4 |
|---|---|
| Target | 0.5 |
| Herbie | 0.9 |
if x < -1.819735868441366e+48 or 3.1891806251302295e+39 < x Initial program 60.6
Simplified56.6
Taylor expanded around inf 0.9
Simplified0.9
if -1.819735868441366e+48 < x < 3.1891806251302295e+39Initial program 1.1
Simplified0.6
rmApplied *-un-lft-identity0.6
Applied add-sqr-sqrt0.8
Applied times-frac0.9
Applied associate-/r*0.9
Simplified0.9
rmApplied log1p-expm1-u0.9
Final simplification0.9
herbie shell --seed 2020027 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:logGamma from math-functions-0.1.5.2, C"
:precision binary64
:herbie-target
(if (< x -3.326128725870005e+62) (- (+ (/ y (* x x)) (* 4.16438922228 x)) 110.1139242984811) (if (< x 9.429991714554673e+55) (* (/ (- x 2) 1) (/ (+ (* (+ (* (+ (* (+ (* x 4.16438922228) 78.6994924154) x) 137.519416416) x) y) x) z) (+ (* (+ (+ (* 263.505074721 x) (+ (* 43.3400022514 (* x x)) (* x (* x x)))) 313.399215894) x) 47.066876606))) (- (+ (/ y (* x x)) (* 4.16438922228 x)) 110.1139242984811)))
(/ (* (- x 2) (+ (* (+ (* (+ (* (+ (* x 4.16438922228) 78.6994924154) x) 137.519416416) x) y) x) z)) (+ (* (+ (* (+ (* (+ x 43.3400022514) x) 263.505074721) x) 313.399215894) x) 47.066876606)))