\frac{x \cdot \frac{\sin y}{y}}{z}
\begin{array}{l}
t_0 := \frac{\sin y}{y}\\
t_1 := \frac{x \cdot t_0}{z}\\
\mathbf{if}\;x \leq -2.0065446232001473 \cdot 10^{+165}:\\
\;\;\;\;t_1\\
\mathbf{elif}\;x \leq 6.135949926575344 \cdot 10^{-59}:\\
\;\;\;\;t_0 \cdot \frac{x}{z}\\
\mathbf{else}:\\
\;\;\;\;t_1\\
\end{array}
(FPCore (x y z) :precision binary64 (/ (* x (/ (sin y) y)) z))
(FPCore (x y z)
:precision binary64
(let* ((t_0 (/ (sin y) y)) (t_1 (/ (* x t_0) z)))
(if (<= x -2.0065446232001473e+165)
t_1
(if (<= x 6.135949926575344e-59) (* t_0 (/ x z)) t_1))))double code(double x, double y, double z) {
return (x * (sin(y) / y)) / z;
}
double code(double x, double y, double z) {
double t_0 = sin(y) / y;
double t_1 = (x * t_0) / z;
double tmp;
if (x <= -2.0065446232001473e+165) {
tmp = t_1;
} else if (x <= 6.135949926575344e-59) {
tmp = t_0 * (x / z);
} else {
tmp = t_1;
}
return tmp;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 2.9 |
|---|---|
| Target | 0.3 |
| Herbie | 0.7 |
if x < -2.0065446232001473e165 or 6.13594992657534381e-59 < x Initial program 0.3
if -2.0065446232001473e165 < x < 6.13594992657534381e-59Initial program 4.5
Applied egg-rr1.0
Final simplification0.7
herbie shell --seed 2022130
(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))