\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 r52294 = 1.0;
double r52295 = x;
double r52296 = cos(r52295);
double r52297 = r52294 - r52296;
double r52298 = sin(r52295);
double r52299 = r52297 / r52298;
return r52299;
}
double f(double x) {
double r52300 = 1.0;
double r52301 = x;
double r52302 = cos(r52301);
double r52303 = r52300 - r52302;
double r52304 = sin(r52301);
double r52305 = r52303 / r52304;
double r52306 = -0.009790179320656275;
bool r52307 = r52305 <= r52306;
double r52308 = 3.0;
double r52309 = pow(r52300, r52308);
double r52310 = pow(r52302, r52308);
double r52311 = pow(r52310, r52308);
double r52312 = cbrt(r52311);
double r52313 = r52309 - r52312;
double r52314 = r52300 + r52302;
double r52315 = r52302 * r52314;
double r52316 = fma(r52300, r52300, r52315);
double r52317 = r52304 * r52316;
double r52318 = r52313 / r52317;
double r52319 = -0.0;
bool r52320 = r52305 <= r52319;
double r52321 = 0.04166666666666663;
double r52322 = pow(r52301, r52308);
double r52323 = 0.004166666666666624;
double r52324 = 5.0;
double r52325 = pow(r52301, r52324);
double r52326 = 0.5;
double r52327 = r52326 * r52301;
double r52328 = fma(r52323, r52325, r52327);
double r52329 = fma(r52321, r52322, r52328);
double r52330 = log1p(r52310);
double r52331 = expm1(r52330);
double r52332 = r52309 - r52331;
double r52333 = r52332 / r52317;
double r52334 = r52320 ? r52329 : r52333;
double r52335 = r52307 ? r52318 : r52334;
return r52335;
}




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