\frac{1 - \cos x}{\sin x}\begin{array}{l}
\mathbf{if}\;\frac{1 - \cos x}{\sin x} \le -0.0097901793206562754:\\
\;\;\;\;\frac{{1}^{3} - \sqrt[3]{{\left({\left(\cos x\right)}^{3}\right)}^{3}}}{\sin x \cdot \mathsf{fma}\left(1, 1, \cos x \cdot \left(1 + \cos x\right)\right)}\\
\mathbf{elif}\;\frac{1 - \cos x}{\sin x} \le -0.0:\\
\;\;\;\;\mathsf{fma}\left(0.04166666666666663, {x}^{3}, \mathsf{fma}\left(0.004166666666666624, {x}^{5}, 0.5 \cdot x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{{1}^{3} - \mathsf{expm1}\left(\mathsf{log1p}\left({\left(\cos x\right)}^{3}\right)\right)}{\sin x \cdot \mathsf{fma}\left(1, 1, \cos x \cdot \left(1 + \cos x\right)\right)}\\
\end{array}double f(double x) {
double r40505 = 1.0;
double r40506 = x;
double r40507 = cos(r40506);
double r40508 = r40505 - r40507;
double r40509 = sin(r40506);
double r40510 = r40508 / r40509;
return r40510;
}
double f(double x) {
double r40511 = 1.0;
double r40512 = x;
double r40513 = cos(r40512);
double r40514 = r40511 - r40513;
double r40515 = sin(r40512);
double r40516 = r40514 / r40515;
double r40517 = -0.009790179320656275;
bool r40518 = r40516 <= r40517;
double r40519 = 3.0;
double r40520 = pow(r40511, r40519);
double r40521 = pow(r40513, r40519);
double r40522 = pow(r40521, r40519);
double r40523 = cbrt(r40522);
double r40524 = r40520 - r40523;
double r40525 = r40511 + r40513;
double r40526 = r40513 * r40525;
double r40527 = fma(r40511, r40511, r40526);
double r40528 = r40515 * r40527;
double r40529 = r40524 / r40528;
double r40530 = -0.0;
bool r40531 = r40516 <= r40530;
double r40532 = 0.04166666666666663;
double r40533 = pow(r40512, r40519);
double r40534 = 0.004166666666666624;
double r40535 = 5.0;
double r40536 = pow(r40512, r40535);
double r40537 = 0.5;
double r40538 = r40537 * r40512;
double r40539 = fma(r40534, r40536, r40538);
double r40540 = fma(r40532, r40533, r40539);
double r40541 = log1p(r40521);
double r40542 = expm1(r40541);
double r40543 = r40520 - r40542;
double r40544 = r40543 / r40528;
double r40545 = r40531 ? r40540 : r40544;
double r40546 = r40518 ? r40529 : r40545;
return r40546;
}




Bits error versus x
| Original | 30.2 |
|---|---|
| Target | 0.0 |
| Herbie | 0.7 |
if (/ (- 1.0 (cos x)) (sin x)) < -0.009790179320656275Initial program 0.8
rmApplied add-log-exp0.9
rmApplied div-inv1.0
Applied exp-prod1.2
Applied log-pow1.1
Simplified0.9
rmApplied flip3--1.0
Applied frac-times1.0
Simplified1.0
Simplified1.0
rmApplied add-cbrt-cube1.1
Simplified1.0
if -0.009790179320656275 < (/ (- 1.0 (cos x)) (sin x)) < -0.0Initial program 60.2
rmApplied add-log-exp60.2
rmApplied div-inv60.2
Applied exp-prod60.2
Applied log-pow60.2
Simplified60.2
rmApplied flip3--60.2
Applied frac-times60.2
Simplified60.2
Simplified60.2
Taylor expanded around 0 0.1
Simplified0.1
if -0.0 < (/ (- 1.0 (cos x)) (sin x)) Initial program 1.6
rmApplied add-log-exp1.6
rmApplied div-inv1.7
Applied exp-prod1.9
Applied log-pow1.9
Simplified1.6
rmApplied flip3--1.7
Applied frac-times1.7
Simplified1.7
Simplified1.7
rmApplied expm1-log1p-u1.7
Final simplification0.7
herbie shell --seed 2020042 +o rules:numerics
(FPCore (x)
:name "tanhf (example 3.4)"
:precision binary64
:herbie-expected 2
:herbie-target
(tan (/ x 2))
(/ (- 1 (cos x)) (sin x)))