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 -329047060.584395707 \lor \neg \left(z \le 0.0137923017903093716\right):\\
\;\;\;\;\mathsf{fma}\left(0.0692910599291888946, y, \mathsf{fma}\left(0.07512208616047561, \frac{y}{z}, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;x + \frac{y}{\sqrt{\mathsf{fma}\left(z + 6.0124592597641033, z, 3.35034381502230394\right)}} \cdot \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)}}\\
\end{array}double f(double x, double y, double z) {
double r291277 = x;
double r291278 = y;
double r291279 = z;
double r291280 = 0.0692910599291889;
double r291281 = r291279 * r291280;
double r291282 = 0.4917317610505968;
double r291283 = r291281 + r291282;
double r291284 = r291283 * r291279;
double r291285 = 0.279195317918525;
double r291286 = r291284 + r291285;
double r291287 = r291278 * r291286;
double r291288 = 6.012459259764103;
double r291289 = r291279 + r291288;
double r291290 = r291289 * r291279;
double r291291 = 3.350343815022304;
double r291292 = r291290 + r291291;
double r291293 = r291287 / r291292;
double r291294 = r291277 + r291293;
return r291294;
}
double f(double x, double y, double z) {
double r291295 = z;
double r291296 = -329047060.5843957;
bool r291297 = r291295 <= r291296;
double r291298 = 0.013792301790309372;
bool r291299 = r291295 <= r291298;
double r291300 = !r291299;
bool r291301 = r291297 || r291300;
double r291302 = 0.0692910599291889;
double r291303 = y;
double r291304 = 0.07512208616047561;
double r291305 = r291303 / r291295;
double r291306 = x;
double r291307 = fma(r291304, r291305, r291306);
double r291308 = fma(r291302, r291303, r291307);
double r291309 = 6.012459259764103;
double r291310 = r291295 + r291309;
double r291311 = 3.350343815022304;
double r291312 = fma(r291310, r291295, r291311);
double r291313 = sqrt(r291312);
double r291314 = r291303 / r291313;
double r291315 = 0.4917317610505968;
double r291316 = fma(r291295, r291302, r291315);
double r291317 = 0.279195317918525;
double r291318 = fma(r291316, r291295, r291317);
double r291319 = r291318 / r291313;
double r291320 = r291314 * r291319;
double r291321 = r291306 + r291320;
double r291322 = r291301 ? r291308 : r291321;
return r291322;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.5 |
|---|---|
| Target | 0.1 |
| Herbie | 0.2 |
if z < -329047060.5843957 or 0.013792301790309372 < z Initial program 41.2
Simplified34.2
Taylor expanded around 0 34.2
Simplified34.2
rmApplied div-inv34.2
Taylor expanded around inf 0.2
Simplified0.2
if -329047060.5843957 < z < 0.013792301790309372Initial program 0.1
rmApplied add-sqr-sqrt0.5
Applied times-frac0.2
Simplified0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019199 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:logGamma from math-functions-0.1.5.2, B"
:herbie-target
(if (< z -8120153.652456675) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291889) y) (- (/ (* 0.40462203869992125 y) (* z z)) x)) (if (< z 6.576118972787377e+20) (+ x (* (* y (+ (* (+ (* z 0.0692910599291889) 0.4917317610505968) z) 0.279195317918525)) (/ 1.0 (+ (* (+ 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))))