x \cdot \left(1 - \left(1 - y\right) \cdot z\right)
\begin{array}{l}
\mathbf{if}\;z \le -1.80567192465547634375199356200760357936 \cdot 10^{-55} \lor \neg \left(z \le 8.891798451741654150614573762157279387393 \cdot 10^{-79}\right):\\
\;\;\;\;\mathsf{fma}\left(x, 1, \left(x \cdot z\right) \cdot \left(y - 1\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(z, y - 1, 1\right) \cdot x\\
\end{array}double f(double x, double y, double z) {
double r633847 = x;
double r633848 = 1.0;
double r633849 = y;
double r633850 = r633848 - r633849;
double r633851 = z;
double r633852 = r633850 * r633851;
double r633853 = r633848 - r633852;
double r633854 = r633847 * r633853;
return r633854;
}
double f(double x, double y, double z) {
double r633855 = z;
double r633856 = -1.8056719246554763e-55;
bool r633857 = r633855 <= r633856;
double r633858 = 8.891798451741654e-79;
bool r633859 = r633855 <= r633858;
double r633860 = !r633859;
bool r633861 = r633857 || r633860;
double r633862 = x;
double r633863 = 1.0;
double r633864 = r633862 * r633855;
double r633865 = y;
double r633866 = r633865 - r633863;
double r633867 = r633864 * r633866;
double r633868 = fma(r633862, r633863, r633867);
double r633869 = fma(r633855, r633866, r633863);
double r633870 = r633869 * r633862;
double r633871 = r633861 ? r633868 : r633870;
return r633871;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 3.4 |
|---|---|
| Target | 0.2 |
| Herbie | 0.2 |
if z < -1.8056719246554763e-55 or 8.891798451741654e-79 < z Initial program 6.7
Simplified6.7
Taylor expanded around inf 6.7
Simplified0.4
if -1.8056719246554763e-55 < z < 8.891798451741654e-79Initial program 0.0
Simplified0.0
Final simplification0.2
herbie shell --seed 2019208 +o rules:numerics
(FPCore (x y z)
:name "Data.Colour.RGBSpace.HSV:hsv from colour-2.3.3, J"
:precision binary64
:herbie-target
(if (< (* x (- 1 (* (- 1 y) z))) -1.618195973607049e50) (+ x (* (- 1 y) (* (- z) x))) (if (< (* x (- 1 (* (- 1 y) z))) 3.8922376496639029e134) (- (* (* x y) z) (- (* x z) x)) (+ x (* (- 1 y) (* (- z) x)))))
(* x (- 1 (* (- 1 y) z))))