\frac{x \cdot \frac{\sin y}{y}}{z}\begin{array}{l}
\mathbf{if}\;z \leq -28100484199212.992:\\
\;\;\;\;\frac{\frac{x \cdot \sin y}{y}}{z}\\
\mathbf{elif}\;z \leq 4.748493217637233 \cdot 10^{-12}:\\
\;\;\;\;\frac{x}{\frac{z}{\frac{\sin y}{y}}}\\
\mathbf{else}:\\
\;\;\;\;\frac{\sin y}{y} \cdot \frac{x}{z}\\
\end{array}(FPCore (x y z) :precision binary64 (/ (* x (/ (sin y) y)) z))
(FPCore (x y z)
:precision binary64
(if (<= z -28100484199212.992)
(/ (/ (* x (sin y)) y) z)
(if (<= z 4.748493217637233e-12)
(/ x (/ z (/ (sin y) y)))
(* (/ (sin y) y) (/ x z)))))double code(double x, double y, double z) {
return (x * (sin(y) / y)) / z;
}
double code(double x, double y, double z) {
double tmp;
if (z <= -28100484199212.992) {
tmp = ((x * sin(y)) / y) / z;
} else if (z <= 4.748493217637233e-12) {
tmp = x / (z / (sin(y) / y));
} else {
tmp = (sin(y) / y) * (x / z);
}
return tmp;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 2.7 |
|---|---|
| Target | 0.2 |
| Herbie | 0.9 |
if z < -28100484199212.992Initial program 0.1
rmApplied associate-*r/_binary642.7
if -28100484199212.992 < z < 4.748493217637233e-12Initial program 5.7
rmApplied associate-/l*_binary640.2
if 4.748493217637233e-12 < z Initial program 0.1
rmApplied associate-/l*_binary644.7
rmApplied associate-/r/_binary640.1
Final simplification0.9
herbie shell --seed 2020233
(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.0 (/ y (sin y)))) z) (if (< z 4.446702369113811e+64) (/ x (* z (/ y (sin y)))) (/ (* x (/ 1.0 (/ y (sin y)))) z)))
(/ (* x (/ (sin y) y)) z))