\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 r587254 = x;
double r587255 = y;
double r587256 = sin(r587255);
double r587257 = r587256 / r587255;
double r587258 = r587254 * r587257;
double r587259 = z;
double r587260 = r587258 / r587259;
return r587260;
}
double f(double x, double y, double z) {
double r587261 = z;
double r587262 = -1.5791765835238173e-58;
bool r587263 = r587261 <= r587262;
double r587264 = 14047118970.925291;
bool r587265 = r587261 <= r587264;
double r587266 = !r587265;
bool r587267 = r587263 || r587266;
double r587268 = x;
double r587269 = 1.0;
double r587270 = y;
double r587271 = r587269 / r587270;
double r587272 = sin(r587270);
double r587273 = r587269 / r587272;
double r587274 = r587271 / r587273;
double r587275 = r587268 * r587274;
double r587276 = r587275 / r587261;
double r587277 = r587272 / r587270;
double r587278 = r587261 / r587277;
double r587279 = r587268 / r587278;
double r587280 = r587267 ? r587276 : r587279;
return r587280;
}




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))