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 -1.2713952720505764 \cdot 10^{154} \lor \neg \left(z \le 4.46938865292930797 \cdot 10^{-7}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{0.07512208616047561}{z}, y, \mathsf{fma}\left(y, 0.0692910599291888946, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;y \cdot \frac{\frac{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.0692910599291888946, 0.49173176105059679\right), z, 0.279195317918524977\right)}{\sqrt{\mathsf{fma}\left(z + 6.0124592597641033, z, 3.35034381502230394\right)}}}{\sqrt{\mathsf{fma}\left(z + 6.0124592597641033, z, 3.35034381502230394\right)}} + x\\
\end{array}double f(double x, double y, double z) {
double r328599 = x;
double r328600 = y;
double r328601 = z;
double r328602 = 0.0692910599291889;
double r328603 = r328601 * r328602;
double r328604 = 0.4917317610505968;
double r328605 = r328603 + r328604;
double r328606 = r328605 * r328601;
double r328607 = 0.279195317918525;
double r328608 = r328606 + r328607;
double r328609 = r328600 * r328608;
double r328610 = 6.012459259764103;
double r328611 = r328601 + r328610;
double r328612 = r328611 * r328601;
double r328613 = 3.350343815022304;
double r328614 = r328612 + r328613;
double r328615 = r328609 / r328614;
double r328616 = r328599 + r328615;
return r328616;
}
double f(double x, double y, double z) {
double r328617 = z;
double r328618 = -1.2713952720505764e+154;
bool r328619 = r328617 <= r328618;
double r328620 = 4.469388652929308e-07;
bool r328621 = r328617 <= r328620;
double r328622 = !r328621;
bool r328623 = r328619 || r328622;
double r328624 = 0.07512208616047561;
double r328625 = r328624 / r328617;
double r328626 = y;
double r328627 = 0.0692910599291889;
double r328628 = x;
double r328629 = fma(r328626, r328627, r328628);
double r328630 = fma(r328625, r328626, r328629);
double r328631 = 0.4917317610505968;
double r328632 = fma(r328617, r328627, r328631);
double r328633 = 0.279195317918525;
double r328634 = fma(r328632, r328617, r328633);
double r328635 = 6.012459259764103;
double r328636 = r328617 + r328635;
double r328637 = 3.350343815022304;
double r328638 = fma(r328636, r328617, r328637);
double r328639 = sqrt(r328638);
double r328640 = r328634 / r328639;
double r328641 = r328640 / r328639;
double r328642 = r328626 * r328641;
double r328643 = r328642 + r328628;
double r328644 = r328623 ? r328630 : r328643;
return r328644;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 19.7 |
|---|---|
| Target | 0.2 |
| Herbie | 0.4 |
if z < -1.2713952720505764e+154 or 4.469388652929308e-07 < z Initial program 46.9
Simplified42.6
Taylor expanded around inf 0.7
Simplified0.7
if -1.2713952720505764e+154 < z < 4.469388652929308e-07Initial program 3.4
Simplified0.7
rmApplied fma-udef0.7
rmApplied div-inv0.7
Applied associate-*l*0.4
Simplified0.1
rmApplied add-sqr-sqrt0.4
Applied associate-/r*0.2
Final simplification0.4
herbie shell --seed 2020062 +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))))