| 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 12.8
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
Simplified0.2
[Start]0.2 | \[ x + \mathsf{fma}\left(\tan y + \tan z, \frac{-1}{-1 + \tan y \cdot \tan z}, -\tan a\right)
\] |
|---|---|
fma-udef [=>]0.2 | \[ x + \color{blue}{\left(\left(\tan y + \tan z\right) \cdot \frac{-1}{-1 + \tan y \cdot \tan z} + \left(-\tan a\right)\right)}
\] |
*-commutative [<=]0.2 | \[ x + \left(\color{blue}{\frac{-1}{-1 + \tan y \cdot \tan z} \cdot \left(\tan y + \tan z\right)} + \left(-\tan a\right)\right)
\] |
unsub-neg [=>]0.2 | \[ x + \color{blue}{\left(\frac{-1}{-1 + \tan y \cdot \tan z} \cdot \left(\tan y + \tan z\right) - \tan a\right)}
\] |
associate-*l/ [=>]0.2 | \[ x + \left(\color{blue}{\frac{-1 \cdot \left(\tan y + \tan z\right)}{-1 + \tan y \cdot \tan z}} - \tan a\right)
\] |
mul-1-neg [=>]0.2 | \[ x + \left(\frac{\color{blue}{-\left(\tan y + \tan z\right)}}{-1 + \tan y \cdot \tan z} - \tan a\right)
\] |
distribute-neg-in [=>]0.2 | \[ x + \left(\frac{\color{blue}{\left(-\tan y\right) + \left(-\tan z\right)}}{-1 + \tan y \cdot \tan z} - \tan a\right)
\] |
sub-neg [<=]0.2 | \[ x + \left(\frac{\color{blue}{\left(-\tan y\right) - \tan z}}{-1 + \tan y \cdot \tan z} - \tan a\right)
\] |
+-commutative [=>]0.2 | \[ x + \left(\frac{\left(-\tan y\right) - \tan z}{\color{blue}{\tan y \cdot \tan z + -1}} - \tan a\right)
\] |
fma-def [=>]0.2 | \[ x + \left(\frac{\left(-\tan y\right) - \tan z}{\color{blue}{\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 | 19.4 |
| Cost | 26185 |
| Alternative 3 | |
|---|---|
| Error | 12.6 |
| Cost | 19776 |
| Alternative 4 | |
|---|---|
| Error | 12.8 |
| Cost | 13248 |
| Alternative 5 | |
|---|---|
| Error | 25.2 |
| Cost | 7369 |
| Alternative 6 | |
|---|---|
| Error | 25.7 |
| Cost | 7241 |
| Alternative 7 | |
|---|---|
| Error | 25.2 |
| Cost | 7113 |
| Alternative 8 | |
|---|---|
| Error | 37.2 |
| Cost | 6592 |
| Alternative 9 | |
|---|---|
| Error | 43.6 |
| Cost | 64 |
herbie shell --seed 2023059
(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))))