x + \left(\tan \left(y + z\right) - \tan a\right)
x + \left(\left(\frac{1}{1 - \frac{\sin y \cdot \sin z}{\cos z \cdot \cos y}} \cdot \left(\frac{\sin y}{\cos y} + \frac{\sin z}{\cos z}\right) - \frac{\sin a}{\cos a}\right) + \frac{\sin a}{\cos a} \cdot \left(\left(-1\right) + 1\right)\right)double f(double x, double y, double z, double a) {
double r122696 = x;
double r122697 = y;
double r122698 = z;
double r122699 = r122697 + r122698;
double r122700 = tan(r122699);
double r122701 = a;
double r122702 = tan(r122701);
double r122703 = r122700 - r122702;
double r122704 = r122696 + r122703;
return r122704;
}
double f(double x, double y, double z, double a) {
double r122705 = x;
double r122706 = 1.0;
double r122707 = y;
double r122708 = sin(r122707);
double r122709 = z;
double r122710 = sin(r122709);
double r122711 = r122708 * r122710;
double r122712 = cos(r122709);
double r122713 = cos(r122707);
double r122714 = r122712 * r122713;
double r122715 = r122711 / r122714;
double r122716 = r122706 - r122715;
double r122717 = r122706 / r122716;
double r122718 = r122708 / r122713;
double r122719 = r122710 / r122712;
double r122720 = r122718 + r122719;
double r122721 = r122717 * r122720;
double r122722 = a;
double r122723 = sin(r122722);
double r122724 = cos(r122722);
double r122725 = r122723 / r122724;
double r122726 = r122721 - r122725;
double r122727 = -r122706;
double r122728 = r122727 + r122706;
double r122729 = r122725 * r122728;
double r122730 = r122726 + r122729;
double r122731 = r122705 + r122730;
return r122731;
}



Bits error versus x



Bits error versus y



Bits error versus z



Bits error versus a
Results
Initial program 12.8
rmApplied tan-sum0.2
Taylor expanded around inf 0.2
rmApplied add-cube-cbrt0.3
Applied *-un-lft-identity0.3
Applied times-frac0.3
Applied *-un-lft-identity0.3
Applied times-frac0.3
Applied distribute-lft-out0.3
Applied prod-diff0.3
Simplified0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2020036 +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))))