\frac{x \cdot \frac{\sin y}{y}}{z}\begin{array}{l}
\mathbf{if}\;x \cdot \frac{\sin y}{y} \le 2.083597813045566445531085328327042967006 \cdot 10^{-202}:\\
\;\;\;\;x \cdot \frac{\frac{1}{\frac{y}{\sin y}}}{z}\\
\mathbf{else}:\\
\;\;\;\;\frac{x \cdot \left(\sin y \cdot \frac{1}{y}\right)}{z}\\
\end{array}double f(double x, double y, double z) {
double r412772 = x;
double r412773 = y;
double r412774 = sin(r412773);
double r412775 = r412774 / r412773;
double r412776 = r412772 * r412775;
double r412777 = z;
double r412778 = r412776 / r412777;
return r412778;
}
double f(double x, double y, double z) {
double r412779 = x;
double r412780 = y;
double r412781 = sin(r412780);
double r412782 = r412781 / r412780;
double r412783 = r412779 * r412782;
double r412784 = 2.0835978130455664e-202;
bool r412785 = r412783 <= r412784;
double r412786 = 1.0;
double r412787 = r412780 / r412781;
double r412788 = r412786 / r412787;
double r412789 = z;
double r412790 = r412788 / r412789;
double r412791 = r412779 * r412790;
double r412792 = r412786 / r412780;
double r412793 = r412781 * r412792;
double r412794 = r412779 * r412793;
double r412795 = r412794 / r412789;
double r412796 = r412785 ? r412791 : r412795;
return r412796;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 2.8 |
|---|---|
| Target | 0.3 |
| Herbie | 1.7 |
if (* x (/ (sin y) y)) < 2.0835978130455664e-202Initial program 4.2
rmApplied *-un-lft-identity4.2
Applied times-frac2.4
Simplified2.4
rmApplied clear-num2.4
if 2.0835978130455664e-202 < (* x (/ (sin y) y)) Initial program 0.2
rmApplied div-inv0.2
Final simplification1.7
herbie shell --seed 2019208 +o rules:numerics
(FPCore (x y z)
:name "Linear.Quaternion:$ctanh from linear-1.19.1.3"
:precision binary64
:herbie-target
(if (< z -4.21737202034271466e-29) (/ (* x (/ 1 (/ y (sin y)))) z) (if (< z 4.44670236911381103e64) (/ x (* z (/ y (sin y)))) (/ (* x (/ 1 (/ y (sin y)))) z)))
(/ (* x (/ (sin y) y)) z))