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 -0.6121835230050514109478854152257554233074 \lor \neg \left(z \le 125942949.1297363936901092529296875\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{z}, 0.07512208616047560960637952121032867580652, \mathsf{fma}\left(0.06929105992918889456166908757950295694172, y, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{\mathsf{fma}\left(z + 6.012459259764103336465268512256443500519, z, 3.350343815022303939343828460550867021084\right)}, \left(\sqrt[3]{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.06929105992918889456166908757950295694172, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right)} \cdot \sqrt[3]{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.06929105992918889456166908757950295694172, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right)}\right) \cdot e^{\log \left(\sqrt[3]{\mathsf{fma}\left(\mathsf{fma}\left(z, 0.06929105992918889456166908757950295694172, 0.4917317610505967939715787906607147306204\right), z, 0.2791953179185249767080279070796677842736\right)}\right)}, x\right)\\
\end{array}double f(double x, double y, double z) {
double r268454 = x;
double r268455 = y;
double r268456 = z;
double r268457 = 0.0692910599291889;
double r268458 = r268456 * r268457;
double r268459 = 0.4917317610505968;
double r268460 = r268458 + r268459;
double r268461 = r268460 * r268456;
double r268462 = 0.279195317918525;
double r268463 = r268461 + r268462;
double r268464 = r268455 * r268463;
double r268465 = 6.012459259764103;
double r268466 = r268456 + r268465;
double r268467 = r268466 * r268456;
double r268468 = 3.350343815022304;
double r268469 = r268467 + r268468;
double r268470 = r268464 / r268469;
double r268471 = r268454 + r268470;
return r268471;
}
double f(double x, double y, double z) {
double r268472 = z;
double r268473 = -0.6121835230050514;
bool r268474 = r268472 <= r268473;
double r268475 = 125942949.1297364;
bool r268476 = r268472 <= r268475;
double r268477 = !r268476;
bool r268478 = r268474 || r268477;
double r268479 = y;
double r268480 = r268479 / r268472;
double r268481 = 0.07512208616047561;
double r268482 = 0.0692910599291889;
double r268483 = x;
double r268484 = fma(r268482, r268479, r268483);
double r268485 = fma(r268480, r268481, r268484);
double r268486 = 6.012459259764103;
double r268487 = r268472 + r268486;
double r268488 = 3.350343815022304;
double r268489 = fma(r268487, r268472, r268488);
double r268490 = r268479 / r268489;
double r268491 = 0.4917317610505968;
double r268492 = fma(r268472, r268482, r268491);
double r268493 = 0.279195317918525;
double r268494 = fma(r268492, r268472, r268493);
double r268495 = cbrt(r268494);
double r268496 = r268495 * r268495;
double r268497 = log(r268495);
double r268498 = exp(r268497);
double r268499 = r268496 * r268498;
double r268500 = fma(r268490, r268499, r268483);
double r268501 = r268478 ? r268485 : r268500;
return r268501;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.3 |
|---|---|
| Target | 0.1 |
| Herbie | 0.2 |
if z < -0.6121835230050514 or 125942949.1297364 < z Initial program 40.8
Simplified33.8
rmApplied add-sqr-sqrt33.9
Applied associate-/r*33.9
Taylor expanded around inf 0.2
Simplified0.2
if -0.6121835230050514 < z < 125942949.1297364Initial program 0.1
Simplified0.1
rmApplied add-cube-cbrt0.2
rmApplied add-exp-log0.2
Final simplification0.2
herbie shell --seed 2019303 +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.6524566747) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291888946) y) (- (/ (* 0.404622038699921249 y) (* z z)) x)) (if (< z 657611897278737680000) (+ x (* (* y (+ (* (+ (* z 0.0692910599291888946) 0.49173176105059679) z) 0.279195317918524977)) (/ 1 (+ (* (+ z 6.0124592597641033) z) 3.35034381502230394)))) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291888946) y) (- (/ (* 0.404622038699921249 y) (* z z)) x))))
(+ x (/ (* y (+ (* (+ (* z 0.0692910599291888946) 0.49173176105059679) z) 0.279195317918524977)) (+ (* (+ z 6.0124592597641033) z) 3.35034381502230394))))