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 -252705366.094031185 \lor \neg \left(z \le 0.442681492773434881\right):\\
\;\;\;\;\mathsf{fma}\left(0.0692910599291888946, y, \mathsf{fma}\left(\frac{y}{z}, 0.07512208616047561, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.0692910599291888946, 0.49173176105059679\right), z, 0.279195317918524977\right)}{\mathsf{fma}\left(z + 6.0124592597641033, z, 3.35034381502230394\right)} \cdot y + x\\
\end{array}double f(double x, double y, double z) {
double r453033 = x;
double r453034 = y;
double r453035 = z;
double r453036 = 0.0692910599291889;
double r453037 = r453035 * r453036;
double r453038 = 0.4917317610505968;
double r453039 = r453037 + r453038;
double r453040 = r453039 * r453035;
double r453041 = 0.279195317918525;
double r453042 = r453040 + r453041;
double r453043 = r453034 * r453042;
double r453044 = 6.012459259764103;
double r453045 = r453035 + r453044;
double r453046 = r453045 * r453035;
double r453047 = 3.350343815022304;
double r453048 = r453046 + r453047;
double r453049 = r453043 / r453048;
double r453050 = r453033 + r453049;
return r453050;
}
double f(double x, double y, double z) {
double r453051 = z;
double r453052 = -252705366.09403118;
bool r453053 = r453051 <= r453052;
double r453054 = 0.4426814927734349;
bool r453055 = r453051 <= r453054;
double r453056 = !r453055;
bool r453057 = r453053 || r453056;
double r453058 = 0.0692910599291889;
double r453059 = y;
double r453060 = r453059 / r453051;
double r453061 = 0.07512208616047561;
double r453062 = x;
double r453063 = fma(r453060, r453061, r453062);
double r453064 = fma(r453058, r453059, r453063);
double r453065 = 0.4917317610505968;
double r453066 = fma(r453051, r453058, r453065);
double r453067 = 0.279195317918525;
double r453068 = fma(r453066, r453051, r453067);
double r453069 = 6.012459259764103;
double r453070 = r453051 + r453069;
double r453071 = 3.350343815022304;
double r453072 = fma(r453070, r453051, r453071);
double r453073 = r453068 / r453072;
double r453074 = r453073 * r453059;
double r453075 = r453074 + r453062;
double r453076 = r453057 ? r453064 : r453075;
return r453076;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.3 |
|---|---|
| Target | 0.2 |
| Herbie | 0.2 |
if z < -252705366.09403118 or 0.4426814927734349 < z Initial program 40.6
Simplified33.9
rmApplied clear-num34.1
Taylor expanded around inf 0.2
Simplified0.2
if -252705366.09403118 < z < 0.4426814927734349Initial program 0.1
Simplified0.1
rmApplied clear-num0.2
rmApplied fma-udef0.2
Simplified0.1
rmApplied associate-/r/0.1
Final simplification0.2
herbie shell --seed 2020042 +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))))