\frac{\cosh x \cdot \frac{y}{x}}{z}\begin{array}{l}
\mathbf{if}\;z \le -52672591011673712 \lor \neg \left(z \le 1.05182668461472934 \cdot 10^{-55}\right):\\
\;\;\;\;\frac{y \cdot \mathsf{fma}\left(e^{x}, \frac{1}{2}, \frac{\frac{1}{2}}{e^{x}}\right)}{z \cdot x}\\
\mathbf{else}:\\
\;\;\;\;\left(\cosh x \cdot \frac{y}{x}\right) \cdot \frac{1}{z}\\
\end{array}double f(double x, double y, double z) {
double r502764 = x;
double r502765 = cosh(r502764);
double r502766 = y;
double r502767 = r502766 / r502764;
double r502768 = r502765 * r502767;
double r502769 = z;
double r502770 = r502768 / r502769;
return r502770;
}
double f(double x, double y, double z) {
double r502771 = z;
double r502772 = -5.267259101167371e+16;
bool r502773 = r502771 <= r502772;
double r502774 = 1.0518266846147293e-55;
bool r502775 = r502771 <= r502774;
double r502776 = !r502775;
bool r502777 = r502773 || r502776;
double r502778 = y;
double r502779 = x;
double r502780 = exp(r502779);
double r502781 = 0.5;
double r502782 = r502781 / r502780;
double r502783 = fma(r502780, r502781, r502782);
double r502784 = r502778 * r502783;
double r502785 = r502771 * r502779;
double r502786 = r502784 / r502785;
double r502787 = cosh(r502779);
double r502788 = r502778 / r502779;
double r502789 = r502787 * r502788;
double r502790 = 1.0;
double r502791 = r502790 / r502771;
double r502792 = r502789 * r502791;
double r502793 = r502777 ? r502786 : r502792;
return r502793;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 7.7 |
|---|---|
| Target | 0.4 |
| Herbie | 0.4 |
if z < -5.267259101167371e+16 or 1.0518266846147293e-55 < z Initial program 11.1
Taylor expanded around inf 0.5
Simplified10.0
rmApplied frac-times0.5
if -5.267259101167371e+16 < z < 1.0518266846147293e-55Initial program 0.3
rmApplied div-inv0.4
Final simplification0.4
herbie shell --seed 2020024 +o rules:numerics
(FPCore (x y z)
:name "Linear.Quaternion:$ctan from linear-1.19.1.3"
:precision binary64
:herbie-target
(if (< y -4.618902267687042e-52) (* (/ (/ y z) x) (cosh x)) (if (< y 1.0385305359351529e-39) (/ (/ (* (cosh x) y) x) z) (* (/ (/ y z) x) (cosh x))))
(/ (* (cosh x) (/ y x)) z))