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 -1902322427.9406998157501220703125 \lor \neg \left(z \le 1882374506400.410888671875\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{0.07512208616047560960637952121032867580652}{z}, y, \mathsf{fma}\left(y, 0.06929105992918889456166908757950295694172, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;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}\\
\end{array}double f(double x, double y, double z) {
double r305743 = x;
double r305744 = y;
double r305745 = z;
double r305746 = 0.0692910599291889;
double r305747 = r305745 * r305746;
double r305748 = 0.4917317610505968;
double r305749 = r305747 + r305748;
double r305750 = r305749 * r305745;
double r305751 = 0.279195317918525;
double r305752 = r305750 + r305751;
double r305753 = r305744 * r305752;
double r305754 = 6.012459259764103;
double r305755 = r305745 + r305754;
double r305756 = r305755 * r305745;
double r305757 = 3.350343815022304;
double r305758 = r305756 + r305757;
double r305759 = r305753 / r305758;
double r305760 = r305743 + r305759;
return r305760;
}
double f(double x, double y, double z) {
double r305761 = z;
double r305762 = -1902322427.9406998;
bool r305763 = r305761 <= r305762;
double r305764 = 1882374506400.411;
bool r305765 = r305761 <= r305764;
double r305766 = !r305765;
bool r305767 = r305763 || r305766;
double r305768 = 0.07512208616047561;
double r305769 = r305768 / r305761;
double r305770 = y;
double r305771 = 0.0692910599291889;
double r305772 = x;
double r305773 = fma(r305770, r305771, r305772);
double r305774 = fma(r305769, r305770, r305773);
double r305775 = r305761 * r305771;
double r305776 = 0.4917317610505968;
double r305777 = r305775 + r305776;
double r305778 = r305777 * r305761;
double r305779 = 0.279195317918525;
double r305780 = r305778 + r305779;
double r305781 = r305770 * r305780;
double r305782 = 6.012459259764103;
double r305783 = r305761 + r305782;
double r305784 = r305783 * r305761;
double r305785 = 3.350343815022304;
double r305786 = r305784 + r305785;
double r305787 = r305781 / r305786;
double r305788 = r305772 + r305787;
double r305789 = r305767 ? r305774 : r305788;
return r305789;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.3 |
|---|---|
| Target | 0.1 |
| Herbie | 0.1 |
if z < -1902322427.9406998 or 1882374506400.411 < z Initial program 41.4
Simplified34.2
Taylor expanded around inf 0.0
Simplified0.0
if -1902322427.9406998 < z < 1882374506400.411Initial program 0.2
Final simplification0.1
herbie shell --seed 2019354 +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))))