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 r182836 = x;
double r182837 = y;
double r182838 = z;
double r182839 = r182837 + r182838;
double r182840 = tan(r182839);
double r182841 = a;
double r182842 = tan(r182841);
double r182843 = r182840 - r182842;
double r182844 = r182836 + r182843;
return r182844;
}
double f(double x, double y, double z, double a) {
double r182845 = x;
double r182846 = 1.0;
double r182847 = y;
double r182848 = sin(r182847);
double r182849 = z;
double r182850 = sin(r182849);
double r182851 = r182848 * r182850;
double r182852 = cos(r182849);
double r182853 = cos(r182847);
double r182854 = r182852 * r182853;
double r182855 = r182851 / r182854;
double r182856 = r182846 - r182855;
double r182857 = r182846 / r182856;
double r182858 = r182848 / r182853;
double r182859 = r182850 / r182852;
double r182860 = r182858 + r182859;
double r182861 = r182857 * r182860;
double r182862 = a;
double r182863 = sin(r182862);
double r182864 = cos(r182862);
double r182865 = r182863 / r182864;
double r182866 = r182861 - r182865;
double r182867 = -r182846;
double r182868 = r182867 + r182846;
double r182869 = r182865 * r182868;
double r182870 = r182866 + r182869;
double r182871 = r182845 + r182870;
return r182871;
}



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