| Alternative 1 | |
|---|---|
| Error | 0.2 |
| Cost | 32832 |
\[x + \left(\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z} - \tan a\right)
\]
(FPCore (x y z a) :precision binary64 (+ x (- (tan (+ y z)) (tan a))))
(FPCore (x y z a) :precision binary64 (- x (+ (tan a) (/ (+ (tan y) (tan z)) (fma (tan y) (tan z) -1.0)))))
double code(double x, double y, double z, double a) {
return x + (tan((y + z)) - tan(a));
}
double code(double x, double y, double z, double a) {
return x - (tan(a) + ((tan(y) + tan(z)) / fma(tan(y), tan(z), -1.0)));
}
function code(x, y, z, a) return Float64(x + Float64(tan(Float64(y + z)) - tan(a))) end
function code(x, y, z, a) return Float64(x - Float64(tan(a) + Float64(Float64(tan(y) + tan(z)) / fma(tan(y), tan(z), -1.0)))) end
code[x_, y_, z_, a_] := N[(x + N[(N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x_, y_, z_, a_] := N[(x - N[(N[Tan[a], $MachinePrecision] + N[(N[(N[Tan[y], $MachinePrecision] + N[Tan[z], $MachinePrecision]), $MachinePrecision] / N[(N[Tan[y], $MachinePrecision] * N[Tan[z], $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
x + \left(\tan \left(y + z\right) - \tan a\right)
x - \left(\tan a + \frac{\tan y + \tan z}{\mathsf{fma}\left(\tan y, \tan z, -1\right)}\right)
Initial program 13.2
Applied egg-rr0.2
Simplified0.2
[Start]0.2 | \[ x + \left(\left(\tan y + \tan z\right) \cdot \frac{1}{1 - \tan y \cdot \tan z} - \tan a\right)
\] |
|---|---|
associate-*r/ [=>]0.2 | \[ x + \left(\color{blue}{\frac{\left(\tan y + \tan z\right) \cdot 1}{1 - \tan y \cdot \tan z}} - \tan a\right)
\] |
*-rgt-identity [=>]0.2 | \[ x + \left(\frac{\color{blue}{\tan y + \tan z}}{1 - \tan y \cdot \tan z} - \tan a\right)
\] |
Applied egg-rr0.2
Applied egg-rr0.2
Simplified0.2
[Start]0.2 | \[ x + \mathsf{fma}\left(\tan y + \tan z, \frac{-1}{\mathsf{fma}\left(\tan y, \tan z, -1\right)}, -\tan a\right)
\] |
|---|---|
fma-udef [=>]0.2 | \[ x + \color{blue}{\left(\left(\tan y + \tan z\right) \cdot \frac{-1}{\mathsf{fma}\left(\tan y, \tan z, -1\right)} + \left(-\tan a\right)\right)}
\] |
unsub-neg [=>]0.2 | \[ x + \color{blue}{\left(\left(\tan y + \tan z\right) \cdot \frac{-1}{\mathsf{fma}\left(\tan y, \tan z, -1\right)} - \tan a\right)}
\] |
associate-*r/ [=>]0.2 | \[ x + \left(\color{blue}{\frac{\left(\tan y + \tan z\right) \cdot -1}{\mathsf{fma}\left(\tan y, \tan z, -1\right)}} - \tan a\right)
\] |
*-commutative [<=]0.2 | \[ x + \left(\frac{\color{blue}{-1 \cdot \left(\tan y + \tan z\right)}}{\mathsf{fma}\left(\tan y, \tan z, -1\right)} - \tan a\right)
\] |
neg-mul-1 [<=]0.2 | \[ x + \left(\frac{\color{blue}{-\left(\tan y + \tan z\right)}}{\mathsf{fma}\left(\tan y, \tan z, -1\right)} - \tan a\right)
\] |
distribute-neg-in [=>]0.2 | \[ x + \left(\frac{\color{blue}{\left(-\tan y\right) + \left(-\tan z\right)}}{\mathsf{fma}\left(\tan y, \tan z, -1\right)} - \tan a\right)
\] |
unsub-neg [=>]0.2 | \[ x + \left(\frac{\color{blue}{\left(-\tan y\right) - \tan z}}{\mathsf{fma}\left(\tan y, \tan z, -1\right)} - \tan a\right)
\] |
Final simplification0.2
| Alternative 1 | |
|---|---|
| Error | 0.2 |
| Cost | 32832 |
| Alternative 2 | |
|---|---|
| Error | 6.8 |
| Cost | 26697 |
| Alternative 3 | |
|---|---|
| Error | 12.9 |
| Cost | 26112 |
| Alternative 4 | |
|---|---|
| Error | 13.2 |
| Cost | 13504 |
| Alternative 5 | |
|---|---|
| Error | 19.3 |
| Cost | 13385 |
| Alternative 6 | |
|---|---|
| Error | 13.2 |
| Cost | 13248 |
| Alternative 7 | |
|---|---|
| Error | 29.0 |
| Cost | 7113 |
| Alternative 8 | |
|---|---|
| Error | 35.1 |
| Cost | 6985 |
| Alternative 9 | |
|---|---|
| Error | 40.2 |
| Cost | 6852 |
| Alternative 10 | |
|---|---|
| Error | 43.8 |
| Cost | 64 |
herbie shell --seed 2023057
(FPCore (x y z a)
:name "tan-example (used to crash)"
:precision binary64
:pre (and (and (and (or (== x 0.0) (and (<= 0.5884142 x) (<= x 505.5909))) (or (and (<= -1.796658e+308 y) (<= y -9.425585e-310)) (and (<= 1.284938e-309 y) (<= y 1.751224e+308)))) (or (and (<= -1.776707e+308 z) (<= z -8.599796e-310)) (and (<= 3.293145e-311 z) (<= z 1.725154e+308)))) (or (and (<= -1.796658e+308 a) (<= a -9.425585e-310)) (and (<= 1.284938e-309 a) (<= a 1.751224e+308))))
(+ x (- (tan (+ y z)) (tan a))))