x + \left(\tan \left(y + z\right) - \tan a\right)
\log \left(e^{x} \cdot \frac{{\left(e^{\frac{\tan y + \tan z}{1 - \left(\tan y \cdot \tan z\right) \cdot \left(\tan y \cdot \tan z\right)}}\right)}^{\left(1 + \tan y \cdot \tan z\right)}}{e^{\tan a}}\right)double f(double x, double y, double z, double a) {
double r244416 = x;
double r244417 = y;
double r244418 = z;
double r244419 = r244417 + r244418;
double r244420 = tan(r244419);
double r244421 = a;
double r244422 = tan(r244421);
double r244423 = r244420 - r244422;
double r244424 = r244416 + r244423;
return r244424;
}
double f(double x, double y, double z, double a) {
double r244425 = x;
double r244426 = exp(r244425);
double r244427 = y;
double r244428 = tan(r244427);
double r244429 = z;
double r244430 = tan(r244429);
double r244431 = r244428 + r244430;
double r244432 = 1.0;
double r244433 = r244428 * r244430;
double r244434 = r244433 * r244433;
double r244435 = r244432 - r244434;
double r244436 = r244431 / r244435;
double r244437 = exp(r244436);
double r244438 = r244432 + r244433;
double r244439 = pow(r244437, r244438);
double r244440 = a;
double r244441 = tan(r244440);
double r244442 = exp(r244441);
double r244443 = r244439 / r244442;
double r244444 = r244426 * r244443;
double r244445 = log(r244444);
return r244445;
}



Bits error versus x



Bits error versus y



Bits error versus z



Bits error versus a
Results
Initial program 13.2
rmApplied tan-sum0.2
rmApplied add-log-exp0.2
Applied add-log-exp0.3
Applied diff-log0.3
Applied add-log-exp0.3
Applied sum-log0.3
Simplified0.3
rmApplied add-log-exp0.3
Applied add-log-exp0.3
Applied diff-log0.3
Applied add-log-exp0.3
Applied sum-log0.3
Applied rem-exp-log0.3
rmApplied flip--0.3
Applied associate-/r/0.3
Applied exp-prod0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020043 +o rules:numerics
(FPCore (x y z a)
:name "(+ x (- (tan (+ y z)) (tan a)))"
:precision binary64
:pre (and (or (== x 0.0) (<= 0.5884142 x 505.5909)) (or (<= -1.796658e+308 y -9.425585e-310) (<= 1.284938e-309 y 1.7512240000000001e+308)) (or (<= -1.7767070000000002e+308 z -8.599796e-310) (<= 3.293145e-311 z 1.725154e+308)) (or (<= -1.796658e+308 a -9.425585e-310) (<= 1.284938e-309 a 1.7512240000000001e+308)))
(+ x (- (tan (+ y z)) (tan a))))