\frac{x \cdot \frac{\sin y}{y}}{z}\begin{array}{l}
\mathbf{if}\;z \le -1.579176583523817341408656991031950031801 \cdot 10^{-58} \lor \neg \left(z \le 14047118970.9252910614013671875\right):\\
\;\;\;\;\frac{x \cdot \frac{\frac{1}{y}}{\frac{1}{\sin y}}}{z}\\
\mathbf{else}:\\
\;\;\;\;\frac{x}{\frac{z}{\frac{\sin y}{y}}}\\
\end{array}double f(double x, double y, double z) {
double r557964 = x;
double r557965 = y;
double r557966 = sin(r557965);
double r557967 = r557966 / r557965;
double r557968 = r557964 * r557967;
double r557969 = z;
double r557970 = r557968 / r557969;
return r557970;
}
double f(double x, double y, double z) {
double r557971 = z;
double r557972 = -1.5791765835238173e-58;
bool r557973 = r557971 <= r557972;
double r557974 = 14047118970.925291;
bool r557975 = r557971 <= r557974;
double r557976 = !r557975;
bool r557977 = r557973 || r557976;
double r557978 = x;
double r557979 = 1.0;
double r557980 = y;
double r557981 = r557979 / r557980;
double r557982 = sin(r557980);
double r557983 = r557979 / r557982;
double r557984 = r557981 / r557983;
double r557985 = r557978 * r557984;
double r557986 = r557985 / r557971;
double r557987 = r557982 / r557980;
double r557988 = r557971 / r557987;
double r557989 = r557978 / r557988;
double r557990 = r557977 ? r557986 : r557989;
return r557990;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 2.9 |
|---|---|
| Target | 0.2 |
| Herbie | 0.2 |
if z < -1.5791765835238173e-58 or 14047118970.925291 < z Initial program 0.2
rmApplied clear-num0.2
rmApplied div-inv0.3
Applied associate-/r*0.2
if -1.5791765835238173e-58 < z < 14047118970.925291Initial program 6.6
rmApplied associate-/l*0.2
Final simplification0.2
herbie shell --seed 2019353
(FPCore (x y z)
:name "Linear.Quaternion:$ctanh from linear-1.19.1.3"
:precision binary64
:herbie-target
(if (< z -4.2173720203427147e-29) (/ (* x (/ 1 (/ y (sin y)))) z) (if (< z 4.446702369113811e+64) (/ x (* z (/ y (sin y)))) (/ (* x (/ 1 (/ y (sin y)))) z)))
(/ (* x (/ (sin y) y)) z))