tan-example (used to crash)

Percentage Accurate: 78.9% → 99.7%
Time: 21.4s
Alternatives: 8
Speedup: 1.0×

Specification

?
\[\left(\left(\left(x = 0 \lor 0.5884142 \leq x \land x \leq 505.5909\right) \land \left(-1.796658 \cdot 10^{+308} \leq y \land y \leq -9.425585 \cdot 10^{-310} \lor 1.284938 \cdot 10^{-309} \leq y \land y \leq 1.751224 \cdot 10^{+308}\right)\right) \land \left(-1.776707 \cdot 10^{+308} \leq z \land z \leq -8.599796 \cdot 10^{-310} \lor 3.293145 \cdot 10^{-311} \leq z \land z \leq 1.725154 \cdot 10^{+308}\right)\right) \land \left(-1.796658 \cdot 10^{+308} \leq a \land a \leq -9.425585 \cdot 10^{-310} \lor 1.284938 \cdot 10^{-309} \leq a \land a \leq 1.751224 \cdot 10^{+308}\right)\]
\[\begin{array}{l} \\ x + \left(\tan \left(y + z\right) - \tan a\right) \end{array} \]
(FPCore (x y z a) :precision binary64 (+ x (- (tan (+ y z)) (tan a))))
double code(double x, double y, double z, double a) {
	return x + (tan((y + z)) - tan(a));
}
real(8) function code(x, y, z, a)
    real(8), intent (in) :: x
    real(8), intent (in) :: y
    real(8), intent (in) :: z
    real(8), intent (in) :: a
    code = x + (tan((y + z)) - tan(a))
end function
public static double code(double x, double y, double z, double a) {
	return x + (Math.tan((y + z)) - Math.tan(a));
}
def code(x, y, z, a):
	return x + (math.tan((y + z)) - math.tan(a))
function code(x, y, z, a)
	return Float64(x + Float64(tan(Float64(y + z)) - tan(a)))
end
function tmp = code(x, y, z, a)
	tmp = x + (tan((y + z)) - tan(a));
end
code[x_, y_, z_, a_] := N[(x + N[(N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}

\\
x + \left(\tan \left(y + z\right) - \tan a\right)
\end{array}

Sampling outcomes in binary64 precision:

Local Percentage Accuracy vs ?

The average percentage accuracy by input value. Horizontal axis shows value of an input variable; the variable is choosen in the title. Vertical axis is accuracy; higher is better. Red represent the original program, while blue represents Herbie's suggestion. These can be toggled with buttons below the plot. The line is an average while dots represent individual samples.

Accuracy vs Speed?

Herbie found 8 alternatives:

AlternativeAccuracySpeedup
The accuracy (vertical axis) and speed (horizontal axis) of each alternatives. Up and to the right is better. The red square shows the initial program, and each blue circle shows an alternative.The line shows the best available speed-accuracy tradeoffs.

Initial Program: 78.9% accurate, 1.0× speedup?

\[\begin{array}{l} \\ x + \left(\tan \left(y + z\right) - \tan a\right) \end{array} \]
(FPCore (x y z a) :precision binary64 (+ x (- (tan (+ y z)) (tan a))))
double code(double x, double y, double z, double a) {
	return x + (tan((y + z)) - tan(a));
}
real(8) function code(x, y, z, a)
    real(8), intent (in) :: x
    real(8), intent (in) :: y
    real(8), intent (in) :: z
    real(8), intent (in) :: a
    code = x + (tan((y + z)) - tan(a))
end function
public static double code(double x, double y, double z, double a) {
	return x + (Math.tan((y + z)) - Math.tan(a));
}
def code(x, y, z, a):
	return x + (math.tan((y + z)) - math.tan(a))
function code(x, y, z, a)
	return Float64(x + Float64(tan(Float64(y + z)) - tan(a)))
end
function tmp = code(x, y, z, a)
	tmp = x + (tan((y + z)) - tan(a));
end
code[x_, y_, z_, a_] := N[(x + N[(N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}

\\
x + \left(\tan \left(y + z\right) - \tan a\right)
\end{array}

Alternative 1: 99.7% accurate, 0.3× speedup?

\[\begin{array}{l} [x, y, z, a] = \mathsf{sort}([x, y, z, a])\\ \\ x + \left(\frac{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \end{array} \]
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
(FPCore (x y z a)
 :precision binary64
 (+
  x
  (-
   (/ (fma (sin z) (pow (cos z) -1.0) (tan y)) (- 1.0 (* (tan z) (tan y))))
   (tan a))))
assert(x < y && y < z && z < a);
double code(double x, double y, double z, double a) {
	return x + ((fma(sin(z), pow(cos(z), -1.0), tan(y)) / (1.0 - (tan(z) * tan(y)))) - tan(a));
}
x, y, z, a = sort([x, y, z, a])
function code(x, y, z, a)
	return Float64(x + Float64(Float64(fma(sin(z), (cos(z) ^ -1.0), tan(y)) / Float64(1.0 - Float64(tan(z) * tan(y)))) - tan(a)))
end
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
code[x_, y_, z_, a_] := N[(x + N[(N[(N[(N[Sin[z], $MachinePrecision] * N[Power[N[Cos[z], $MachinePrecision], -1.0], $MachinePrecision] + N[Tan[y], $MachinePrecision]), $MachinePrecision] / N[(1.0 - N[(N[Tan[z], $MachinePrecision] * N[Tan[y], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
[x, y, z, a] = \mathsf{sort}([x, y, z, a])\\
\\
x + \left(\frac{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right)
\end{array}
Derivation
  1. Initial program 76.2%

    \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
  2. Add Preprocessing
  3. Step-by-step derivation
    1. lift-tan.f64N/A

      \[\leadsto x + \left(\color{blue}{\tan \left(y + z\right)} - \tan a\right) \]
    2. lift-+.f64N/A

      \[\leadsto x + \left(\tan \color{blue}{\left(y + z\right)} - \tan a\right) \]
    3. tan-sumN/A

      \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    4. lower-/.f64N/A

      \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    5. +-commutativeN/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    6. lower-+.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    7. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    8. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    9. lower--.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    10. *-commutativeN/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
    11. lower-*.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
    12. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
    13. lower-tan.f6499.7

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
  4. Applied rewrites99.7%

    \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
  5. Step-by-step derivation
    1. lift-+.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    2. lift-tan.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    3. tan-quotN/A

      \[\leadsto x + \left(\frac{\color{blue}{\frac{\sin z}{\cos z}} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    4. div-invN/A

      \[\leadsto x + \left(\frac{\color{blue}{\sin z \cdot \frac{1}{\cos z}} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    5. lower-fma.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\mathsf{fma}\left(\sin z, \frac{1}{\cos z}, \tan y\right)}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    6. lower-sin.f64N/A

      \[\leadsto x + \left(\frac{\mathsf{fma}\left(\color{blue}{\sin z}, \frac{1}{\cos z}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    7. inv-powN/A

      \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{{\cos z}^{-1}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    8. lower-pow.f64N/A

      \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{{\cos z}^{-1}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    9. lower-cos.f6499.7

      \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, {\color{blue}{\cos z}}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
  6. Applied rewrites99.7%

    \[\leadsto x + \left(\frac{\color{blue}{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
  7. Step-by-step derivation
    1. lift-pow.f64N/A

      \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{{\cos z}^{-1}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    2. unpow-1N/A

      \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{\frac{1}{\cos z}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    3. lower-/.f6499.7

      \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{\frac{1}{\cos z}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
  8. Applied rewrites99.7%

    \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{\frac{1}{\cos z}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
  9. Final simplification99.7%

    \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
  10. Add Preprocessing

Alternative 2: 99.7% accurate, 0.4× speedup?

\[\begin{array}{l} [x, y, z, a] = \mathsf{sort}([x, y, z, a])\\ \\ x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \end{array} \]
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
(FPCore (x y z a)
 :precision binary64
 (+ x (- (/ (+ (tan z) (tan y)) (- 1.0 (* (tan z) (tan y)))) (tan a))))
assert(x < y && y < z && z < a);
double code(double x, double y, double z, double a) {
	return x + (((tan(z) + tan(y)) / (1.0 - (tan(z) * tan(y)))) - tan(a));
}
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
real(8) function code(x, y, z, a)
    real(8), intent (in) :: x
    real(8), intent (in) :: y
    real(8), intent (in) :: z
    real(8), intent (in) :: a
    code = x + (((tan(z) + tan(y)) / (1.0d0 - (tan(z) * tan(y)))) - tan(a))
end function
assert x < y && y < z && z < a;
public static double code(double x, double y, double z, double a) {
	return x + (((Math.tan(z) + Math.tan(y)) / (1.0 - (Math.tan(z) * Math.tan(y)))) - Math.tan(a));
}
[x, y, z, a] = sort([x, y, z, a])
def code(x, y, z, a):
	return x + (((math.tan(z) + math.tan(y)) / (1.0 - (math.tan(z) * math.tan(y)))) - math.tan(a))
x, y, z, a = sort([x, y, z, a])
function code(x, y, z, a)
	return Float64(x + Float64(Float64(Float64(tan(z) + tan(y)) / Float64(1.0 - Float64(tan(z) * tan(y)))) - tan(a)))
end
x, y, z, a = num2cell(sort([x, y, z, a])){:}
function tmp = code(x, y, z, a)
	tmp = x + (((tan(z) + tan(y)) / (1.0 - (tan(z) * tan(y)))) - tan(a));
end
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
code[x_, y_, z_, a_] := N[(x + N[(N[(N[(N[Tan[z], $MachinePrecision] + N[Tan[y], $MachinePrecision]), $MachinePrecision] / N[(1.0 - N[(N[Tan[z], $MachinePrecision] * N[Tan[y], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
[x, y, z, a] = \mathsf{sort}([x, y, z, a])\\
\\
x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right)
\end{array}
Derivation
  1. Initial program 76.2%

    \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
  2. Add Preprocessing
  3. Step-by-step derivation
    1. lift-tan.f64N/A

      \[\leadsto x + \left(\color{blue}{\tan \left(y + z\right)} - \tan a\right) \]
    2. lift-+.f64N/A

      \[\leadsto x + \left(\tan \color{blue}{\left(y + z\right)} - \tan a\right) \]
    3. tan-sumN/A

      \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    4. lower-/.f64N/A

      \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    5. +-commutativeN/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    6. lower-+.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    7. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    8. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    9. lower--.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    10. *-commutativeN/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
    11. lower-*.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
    12. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
    13. lower-tan.f6499.7

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
  4. Applied rewrites99.7%

    \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
  5. Add Preprocessing

Alternative 3: 99.7% accurate, 0.4× speedup?

\[\begin{array}{l} [x, y, z, a] = \mathsf{sort}([x, y, z, a])\\ \\ x + \left(\frac{\tan y + \tan z}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)} - \tan a\right) \end{array} \]
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
(FPCore (x y z a)
 :precision binary64
 (+ x (- (/ (+ (tan y) (tan z)) (fma (- (tan y)) (tan z) 1.0)) (tan a))))
assert(x < y && y < z && z < a);
double code(double x, double y, double z, double a) {
	return x + (((tan(y) + tan(z)) / fma(-tan(y), tan(z), 1.0)) - tan(a));
}
x, y, z, a = sort([x, y, z, a])
function code(x, y, z, a)
	return Float64(x + Float64(Float64(Float64(tan(y) + tan(z)) / fma(Float64(-tan(y)), tan(z), 1.0)) - tan(a)))
end
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
code[x_, y_, z_, a_] := N[(x + N[(N[(N[(N[Tan[y], $MachinePrecision] + N[Tan[z], $MachinePrecision]), $MachinePrecision] / N[((-N[Tan[y], $MachinePrecision]) * N[Tan[z], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
[x, y, z, a] = \mathsf{sort}([x, y, z, a])\\
\\
x + \left(\frac{\tan y + \tan z}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)} - \tan a\right)
\end{array}
Derivation
  1. Initial program 76.2%

    \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
  2. Add Preprocessing
  3. Step-by-step derivation
    1. lift-tan.f64N/A

      \[\leadsto x + \left(\color{blue}{\tan \left(y + z\right)} - \tan a\right) \]
    2. lift-+.f64N/A

      \[\leadsto x + \left(\tan \color{blue}{\left(y + z\right)} - \tan a\right) \]
    3. tan-sumN/A

      \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    4. lower-/.f64N/A

      \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    5. +-commutativeN/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    6. lower-+.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    7. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    8. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
    9. lower--.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
    10. *-commutativeN/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
    11. lower-*.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
    12. lower-tan.f64N/A

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
    13. lower-tan.f6499.7

      \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
  4. Applied rewrites99.7%

    \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
  5. Step-by-step derivation
    1. lift-+.f64N/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    2. +-commutativeN/A

      \[\leadsto x + \left(\frac{\color{blue}{\tan y + \tan z}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    3. lower-+.f6499.7

      \[\leadsto x + \left(\frac{\color{blue}{\tan y + \tan z}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    4. lift--.f64N/A

      \[\leadsto x + \left(\frac{\tan y + \tan z}{\color{blue}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
    5. sub-negN/A

      \[\leadsto x + \left(\frac{\tan y + \tan z}{\color{blue}{1 + \left(\mathsf{neg}\left(\tan z \cdot \tan y\right)\right)}} - \tan a\right) \]
    6. +-commutativeN/A

      \[\leadsto x + \left(\frac{\tan y + \tan z}{\color{blue}{\left(\mathsf{neg}\left(\tan z \cdot \tan y\right)\right) + 1}} - \tan a\right) \]
    7. lift-*.f64N/A

      \[\leadsto x + \left(\frac{\tan y + \tan z}{\left(\mathsf{neg}\left(\color{blue}{\tan z \cdot \tan y}\right)\right) + 1} - \tan a\right) \]
    8. *-commutativeN/A

      \[\leadsto x + \left(\frac{\tan y + \tan z}{\left(\mathsf{neg}\left(\color{blue}{\tan y \cdot \tan z}\right)\right) + 1} - \tan a\right) \]
    9. distribute-lft-neg-inN/A

      \[\leadsto x + \left(\frac{\tan y + \tan z}{\color{blue}{\left(\mathsf{neg}\left(\tan y\right)\right) \cdot \tan z} + 1} - \tan a\right) \]
    10. lower-fma.f64N/A

      \[\leadsto x + \left(\frac{\tan y + \tan z}{\color{blue}{\mathsf{fma}\left(\mathsf{neg}\left(\tan y\right), \tan z, 1\right)}} - \tan a\right) \]
    11. lower-neg.f6499.7

      \[\leadsto x + \left(\frac{\tan y + \tan z}{\mathsf{fma}\left(\color{blue}{-\tan y}, \tan z, 1\right)} - \tan a\right) \]
  6. Applied rewrites99.7%

    \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}} - \tan a\right) \]
  7. Add Preprocessing

Alternative 4: 89.3% accurate, 0.5× speedup?

\[\begin{array}{l} [x, y, z, a] = \mathsf{sort}([x, y, z, a])\\ \\ \begin{array}{l} \mathbf{if}\;a \leq -9 \cdot 10^{-5}:\\ \;\;\;\;\mathsf{fma}\left(\frac{\frac{\sin \left(z + y\right)}{\cos \left(z + y\right)} - \frac{\sin a}{\cos a}}{x}, x, x\right)\\ \mathbf{elif}\;a \leq 0.00034:\\ \;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(a - x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\ \end{array} \end{array} \]
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
(FPCore (x y z a)
 :precision binary64
 (if (<= a -9e-5)
   (fma (/ (- (/ (sin (+ z y)) (cos (+ z y))) (/ (sin a) (cos a))) x) x x)
   (if (<= a 0.00034)
     (fma
      (- (+ (tan z) (tan y)))
      (/ -1.0 (fma (- (tan y)) (tan z) 1.0))
      (- (- a x)))
     (+ x (fma (/ -1.0 (cos a)) (sin a) (tan (+ y z)))))))
assert(x < y && y < z && z < a);
double code(double x, double y, double z, double a) {
	double tmp;
	if (a <= -9e-5) {
		tmp = fma((((sin((z + y)) / cos((z + y))) - (sin(a) / cos(a))) / x), x, x);
	} else if (a <= 0.00034) {
		tmp = fma(-(tan(z) + tan(y)), (-1.0 / fma(-tan(y), tan(z), 1.0)), -(a - x));
	} else {
		tmp = x + fma((-1.0 / cos(a)), sin(a), tan((y + z)));
	}
	return tmp;
}
x, y, z, a = sort([x, y, z, a])
function code(x, y, z, a)
	tmp = 0.0
	if (a <= -9e-5)
		tmp = fma(Float64(Float64(Float64(sin(Float64(z + y)) / cos(Float64(z + y))) - Float64(sin(a) / cos(a))) / x), x, x);
	elseif (a <= 0.00034)
		tmp = fma(Float64(-Float64(tan(z) + tan(y))), Float64(-1.0 / fma(Float64(-tan(y)), tan(z), 1.0)), Float64(-Float64(a - x)));
	else
		tmp = Float64(x + fma(Float64(-1.0 / cos(a)), sin(a), tan(Float64(y + z))));
	end
	return tmp
end
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
code[x_, y_, z_, a_] := If[LessEqual[a, -9e-5], N[(N[(N[(N[(N[Sin[N[(z + y), $MachinePrecision]], $MachinePrecision] / N[Cos[N[(z + y), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] - N[(N[Sin[a], $MachinePrecision] / N[Cos[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / x), $MachinePrecision] * x + x), $MachinePrecision], If[LessEqual[a, 0.00034], N[((-N[(N[Tan[z], $MachinePrecision] + N[Tan[y], $MachinePrecision]), $MachinePrecision]) * N[(-1.0 / N[((-N[Tan[y], $MachinePrecision]) * N[Tan[z], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision] + (-N[(a - x), $MachinePrecision])), $MachinePrecision], N[(x + N[(N[(-1.0 / N[Cos[a], $MachinePrecision]), $MachinePrecision] * N[Sin[a], $MachinePrecision] + N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
[x, y, z, a] = \mathsf{sort}([x, y, z, a])\\
\\
\begin{array}{l}
\mathbf{if}\;a \leq -9 \cdot 10^{-5}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\frac{\sin \left(z + y\right)}{\cos \left(z + y\right)} - \frac{\sin a}{\cos a}}{x}, x, x\right)\\

\mathbf{elif}\;a \leq 0.00034:\\
\;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(a - x\right)\right)\\

\mathbf{else}:\\
\;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\


\end{array}
\end{array}
Derivation
  1. Split input into 3 regimes
  2. if a < -9.00000000000000057e-5

    1. Initial program 67.5%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Taylor expanded in x around inf

      \[\leadsto \color{blue}{x \cdot \left(\left(1 + \frac{\sin \left(y + z\right)}{x \cdot \cos \left(y + z\right)}\right) - \frac{\sin a}{x \cdot \cos a}\right)} \]
    4. Step-by-step derivation
      1. associate--l+N/A

        \[\leadsto x \cdot \color{blue}{\left(1 + \left(\frac{\sin \left(y + z\right)}{x \cdot \cos \left(y + z\right)} - \frac{\sin a}{x \cdot \cos a}\right)\right)} \]
      2. distribute-rgt-inN/A

        \[\leadsto \color{blue}{1 \cdot x + \left(\frac{\sin \left(y + z\right)}{x \cdot \cos \left(y + z\right)} - \frac{\sin a}{x \cdot \cos a}\right) \cdot x} \]
      3. *-lft-identityN/A

        \[\leadsto \color{blue}{x} + \left(\frac{\sin \left(y + z\right)}{x \cdot \cos \left(y + z\right)} - \frac{\sin a}{x \cdot \cos a}\right) \cdot x \]
      4. +-commutativeN/A

        \[\leadsto \color{blue}{\left(\frac{\sin \left(y + z\right)}{x \cdot \cos \left(y + z\right)} - \frac{\sin a}{x \cdot \cos a}\right) \cdot x + x} \]
      5. *-commutativeN/A

        \[\leadsto \left(\frac{\sin \left(y + z\right)}{\color{blue}{\cos \left(y + z\right) \cdot x}} - \frac{\sin a}{x \cdot \cos a}\right) \cdot x + x \]
      6. associate-/r*N/A

        \[\leadsto \left(\color{blue}{\frac{\frac{\sin \left(y + z\right)}{\cos \left(y + z\right)}}{x}} - \frac{\sin a}{x \cdot \cos a}\right) \cdot x + x \]
      7. *-commutativeN/A

        \[\leadsto \left(\frac{\frac{\sin \left(y + z\right)}{\cos \left(y + z\right)}}{x} - \frac{\sin a}{\color{blue}{\cos a \cdot x}}\right) \cdot x + x \]
      8. associate-/r*N/A

        \[\leadsto \left(\frac{\frac{\sin \left(y + z\right)}{\cos \left(y + z\right)}}{x} - \color{blue}{\frac{\frac{\sin a}{\cos a}}{x}}\right) \cdot x + x \]
      9. div-subN/A

        \[\leadsto \color{blue}{\frac{\frac{\sin \left(y + z\right)}{\cos \left(y + z\right)} - \frac{\sin a}{\cos a}}{x}} \cdot x + x \]
    5. Applied rewrites67.6%

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{\frac{\sin \left(z + y\right)}{\cos \left(z + y\right)} - \frac{\sin a}{\cos a}}{x}, x, x\right)} \]

    if -9.00000000000000057e-5 < a < 3.4e-4

    1. Initial program 79.4%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-+.f64N/A

        \[\leadsto \color{blue}{x + \left(\tan \left(y + z\right) - \tan a\right)} \]
      2. +-commutativeN/A

        \[\leadsto \color{blue}{\left(\tan \left(y + z\right) - \tan a\right) + x} \]
      3. lift--.f64N/A

        \[\leadsto \color{blue}{\left(\tan \left(y + z\right) - \tan a\right)} + x \]
      4. associate-+l-N/A

        \[\leadsto \color{blue}{\tan \left(y + z\right) - \left(\tan a - x\right)} \]
      5. lower--.f64N/A

        \[\leadsto \color{blue}{\tan \left(y + z\right) - \left(\tan a - x\right)} \]
      6. lift-+.f64N/A

        \[\leadsto \tan \color{blue}{\left(y + z\right)} - \left(\tan a - x\right) \]
      7. +-commutativeN/A

        \[\leadsto \tan \color{blue}{\left(z + y\right)} - \left(\tan a - x\right) \]
      8. lower-+.f64N/A

        \[\leadsto \tan \color{blue}{\left(z + y\right)} - \left(\tan a - x\right) \]
      9. lower--.f6479.4

        \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(\tan a - x\right)} \]
    4. Applied rewrites79.4%

      \[\leadsto \color{blue}{\tan \left(z + y\right) - \left(\tan a - x\right)} \]
    5. Taylor expanded in a around 0

      \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(a - x\right)} \]
    6. Step-by-step derivation
      1. lower--.f6479.4

        \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(a - x\right)} \]
    7. Applied rewrites79.4%

      \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(a - x\right)} \]
    8. Applied rewrites99.9%

      \[\leadsto \color{blue}{\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{1}{-\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(a - x\right)\right)} \]

    if 3.4e-4 < a

    1. Initial program 80.0%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-tan.f64N/A

        \[\leadsto x + \left(\color{blue}{\tan \left(y + z\right)} - \tan a\right) \]
      2. lift-+.f64N/A

        \[\leadsto x + \left(\tan \color{blue}{\left(y + z\right)} - \tan a\right) \]
      3. tan-sumN/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      4. lower-/.f64N/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      5. +-commutativeN/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      6. lower-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      7. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      8. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      9. lower--.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      10. *-commutativeN/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      11. lower-*.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      12. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
      13. lower-tan.f6499.6

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
    4. Applied rewrites99.6%

      \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
    5. Step-by-step derivation
      1. lift--.f64N/A

        \[\leadsto x + \color{blue}{\left(\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right)} \]
      2. lift-/.f64N/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
      3. lift-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      4. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      5. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      6. lift--.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
      7. lift-*.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      8. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
      9. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
      10. tan-sum-revN/A

        \[\leadsto x + \left(\color{blue}{\tan \left(z + y\right)} - \tan a\right) \]
      11. lift-+.f64N/A

        \[\leadsto x + \left(\tan \color{blue}{\left(z + y\right)} - \tan a\right) \]
      12. lift-tan.f64N/A

        \[\leadsto x + \left(\color{blue}{\tan \left(z + y\right)} - \tan a\right) \]
      13. sub-negN/A

        \[\leadsto x + \color{blue}{\left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\tan a\right)\right)\right)} \]
      14. lift-tan.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\color{blue}{\tan a}\right)\right)\right) \]
      15. tan-quotN/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\color{blue}{\frac{\sin a}{\cos a}}\right)\right)\right) \]
      16. lift-sin.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\frac{\color{blue}{\sin a}}{\cos a}\right)\right)\right) \]
      17. lift-cos.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\frac{\sin a}{\color{blue}{\cos a}}\right)\right)\right) \]
      18. distribute-frac-neg2N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \color{blue}{\frac{\sin a}{\mathsf{neg}\left(\cos a\right)}}\right) \]
      19. lift-neg.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \frac{\sin a}{\color{blue}{-\cos a}}\right) \]
      20. un-div-invN/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \color{blue}{\sin a \cdot \frac{1}{-\cos a}}\right) \]
    6. Applied rewrites80.1%

      \[\leadsto x + \color{blue}{\mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)} \]
  3. Recombined 3 regimes into one program.
  4. Final simplification85.9%

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \leq -9 \cdot 10^{-5}:\\ \;\;\;\;\mathsf{fma}\left(\frac{\frac{\sin \left(z + y\right)}{\cos \left(z + y\right)} - \frac{\sin a}{\cos a}}{x}, x, x\right)\\ \mathbf{elif}\;a \leq 0.00034:\\ \;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(a - x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\ \end{array} \]
  5. Add Preprocessing

Alternative 5: 89.3% accurate, 0.5× speedup?

\[\begin{array}{l} [x, y, z, a] = \mathsf{sort}([x, y, z, a])\\ \\ \begin{array}{l} \mathbf{if}\;a \leq -9 \cdot 10^{-5}:\\ \;\;\;\;x + \mathsf{fma}\left(\sin \left(y + z\right), {\cos \left(y + z\right)}^{-1}, -\tan a\right)\\ \mathbf{elif}\;a \leq 0.00034:\\ \;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(a - x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\ \end{array} \end{array} \]
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
(FPCore (x y z a)
 :precision binary64
 (if (<= a -9e-5)
   (+ x (fma (sin (+ y z)) (pow (cos (+ y z)) -1.0) (- (tan a))))
   (if (<= a 0.00034)
     (fma
      (- (+ (tan z) (tan y)))
      (/ -1.0 (fma (- (tan y)) (tan z) 1.0))
      (- (- a x)))
     (+ x (fma (/ -1.0 (cos a)) (sin a) (tan (+ y z)))))))
assert(x < y && y < z && z < a);
double code(double x, double y, double z, double a) {
	double tmp;
	if (a <= -9e-5) {
		tmp = x + fma(sin((y + z)), pow(cos((y + z)), -1.0), -tan(a));
	} else if (a <= 0.00034) {
		tmp = fma(-(tan(z) + tan(y)), (-1.0 / fma(-tan(y), tan(z), 1.0)), -(a - x));
	} else {
		tmp = x + fma((-1.0 / cos(a)), sin(a), tan((y + z)));
	}
	return tmp;
}
x, y, z, a = sort([x, y, z, a])
function code(x, y, z, a)
	tmp = 0.0
	if (a <= -9e-5)
		tmp = Float64(x + fma(sin(Float64(y + z)), (cos(Float64(y + z)) ^ -1.0), Float64(-tan(a))));
	elseif (a <= 0.00034)
		tmp = fma(Float64(-Float64(tan(z) + tan(y))), Float64(-1.0 / fma(Float64(-tan(y)), tan(z), 1.0)), Float64(-Float64(a - x)));
	else
		tmp = Float64(x + fma(Float64(-1.0 / cos(a)), sin(a), tan(Float64(y + z))));
	end
	return tmp
end
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
code[x_, y_, z_, a_] := If[LessEqual[a, -9e-5], N[(x + N[(N[Sin[N[(y + z), $MachinePrecision]], $MachinePrecision] * N[Power[N[Cos[N[(y + z), $MachinePrecision]], $MachinePrecision], -1.0], $MachinePrecision] + (-N[Tan[a], $MachinePrecision])), $MachinePrecision]), $MachinePrecision], If[LessEqual[a, 0.00034], N[((-N[(N[Tan[z], $MachinePrecision] + N[Tan[y], $MachinePrecision]), $MachinePrecision]) * N[(-1.0 / N[((-N[Tan[y], $MachinePrecision]) * N[Tan[z], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision] + (-N[(a - x), $MachinePrecision])), $MachinePrecision], N[(x + N[(N[(-1.0 / N[Cos[a], $MachinePrecision]), $MachinePrecision] * N[Sin[a], $MachinePrecision] + N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
[x, y, z, a] = \mathsf{sort}([x, y, z, a])\\
\\
\begin{array}{l}
\mathbf{if}\;a \leq -9 \cdot 10^{-5}:\\
\;\;\;\;x + \mathsf{fma}\left(\sin \left(y + z\right), {\cos \left(y + z\right)}^{-1}, -\tan a\right)\\

\mathbf{elif}\;a \leq 0.00034:\\
\;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(a - x\right)\right)\\

\mathbf{else}:\\
\;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\


\end{array}
\end{array}
Derivation
  1. Split input into 3 regimes
  2. if a < -9.00000000000000057e-5

    1. Initial program 67.5%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-tan.f64N/A

        \[\leadsto x + \left(\color{blue}{\tan \left(y + z\right)} - \tan a\right) \]
      2. lift-+.f64N/A

        \[\leadsto x + \left(\tan \color{blue}{\left(y + z\right)} - \tan a\right) \]
      3. tan-sumN/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      4. lower-/.f64N/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      5. +-commutativeN/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      6. lower-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      7. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      8. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      9. lower--.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      10. *-commutativeN/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      11. lower-*.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      12. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
      13. lower-tan.f6499.7

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
    4. Applied rewrites99.7%

      \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
    5. Step-by-step derivation
      1. lift-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      2. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      3. tan-quotN/A

        \[\leadsto x + \left(\frac{\color{blue}{\frac{\sin z}{\cos z}} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      4. div-invN/A

        \[\leadsto x + \left(\frac{\color{blue}{\sin z \cdot \frac{1}{\cos z}} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      5. lower-fma.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\mathsf{fma}\left(\sin z, \frac{1}{\cos z}, \tan y\right)}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      6. lower-sin.f64N/A

        \[\leadsto x + \left(\frac{\mathsf{fma}\left(\color{blue}{\sin z}, \frac{1}{\cos z}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      7. inv-powN/A

        \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{{\cos z}^{-1}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      8. lower-pow.f64N/A

        \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{{\cos z}^{-1}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      9. lower-cos.f6499.5

        \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, {\color{blue}{\cos z}}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    6. Applied rewrites99.5%

      \[\leadsto x + \left(\frac{\color{blue}{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    7. Step-by-step derivation
      1. lift--.f64N/A

        \[\leadsto x + \color{blue}{\left(\frac{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right)} \]
      2. sub-negN/A

        \[\leadsto x + \color{blue}{\left(\frac{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} + \left(\mathsf{neg}\left(\tan a\right)\right)\right)} \]
    8. Applied rewrites67.5%

      \[\leadsto x + \color{blue}{\mathsf{fma}\left(\sin \left(y + z\right), \frac{1}{\cos \left(y + z\right)}, -\tan a\right)} \]

    if -9.00000000000000057e-5 < a < 3.4e-4

    1. Initial program 79.4%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-+.f64N/A

        \[\leadsto \color{blue}{x + \left(\tan \left(y + z\right) - \tan a\right)} \]
      2. +-commutativeN/A

        \[\leadsto \color{blue}{\left(\tan \left(y + z\right) - \tan a\right) + x} \]
      3. lift--.f64N/A

        \[\leadsto \color{blue}{\left(\tan \left(y + z\right) - \tan a\right)} + x \]
      4. associate-+l-N/A

        \[\leadsto \color{blue}{\tan \left(y + z\right) - \left(\tan a - x\right)} \]
      5. lower--.f64N/A

        \[\leadsto \color{blue}{\tan \left(y + z\right) - \left(\tan a - x\right)} \]
      6. lift-+.f64N/A

        \[\leadsto \tan \color{blue}{\left(y + z\right)} - \left(\tan a - x\right) \]
      7. +-commutativeN/A

        \[\leadsto \tan \color{blue}{\left(z + y\right)} - \left(\tan a - x\right) \]
      8. lower-+.f64N/A

        \[\leadsto \tan \color{blue}{\left(z + y\right)} - \left(\tan a - x\right) \]
      9. lower--.f6479.4

        \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(\tan a - x\right)} \]
    4. Applied rewrites79.4%

      \[\leadsto \color{blue}{\tan \left(z + y\right) - \left(\tan a - x\right)} \]
    5. Taylor expanded in a around 0

      \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(a - x\right)} \]
    6. Step-by-step derivation
      1. lower--.f6479.4

        \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(a - x\right)} \]
    7. Applied rewrites79.4%

      \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(a - x\right)} \]
    8. Applied rewrites99.9%

      \[\leadsto \color{blue}{\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{1}{-\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(a - x\right)\right)} \]

    if 3.4e-4 < a

    1. Initial program 80.0%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-tan.f64N/A

        \[\leadsto x + \left(\color{blue}{\tan \left(y + z\right)} - \tan a\right) \]
      2. lift-+.f64N/A

        \[\leadsto x + \left(\tan \color{blue}{\left(y + z\right)} - \tan a\right) \]
      3. tan-sumN/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      4. lower-/.f64N/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      5. +-commutativeN/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      6. lower-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      7. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      8. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      9. lower--.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      10. *-commutativeN/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      11. lower-*.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      12. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
      13. lower-tan.f6499.6

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
    4. Applied rewrites99.6%

      \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
    5. Step-by-step derivation
      1. lift--.f64N/A

        \[\leadsto x + \color{blue}{\left(\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right)} \]
      2. lift-/.f64N/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
      3. lift-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      4. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      5. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      6. lift--.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
      7. lift-*.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      8. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
      9. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
      10. tan-sum-revN/A

        \[\leadsto x + \left(\color{blue}{\tan \left(z + y\right)} - \tan a\right) \]
      11. lift-+.f64N/A

        \[\leadsto x + \left(\tan \color{blue}{\left(z + y\right)} - \tan a\right) \]
      12. lift-tan.f64N/A

        \[\leadsto x + \left(\color{blue}{\tan \left(z + y\right)} - \tan a\right) \]
      13. sub-negN/A

        \[\leadsto x + \color{blue}{\left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\tan a\right)\right)\right)} \]
      14. lift-tan.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\color{blue}{\tan a}\right)\right)\right) \]
      15. tan-quotN/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\color{blue}{\frac{\sin a}{\cos a}}\right)\right)\right) \]
      16. lift-sin.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\frac{\color{blue}{\sin a}}{\cos a}\right)\right)\right) \]
      17. lift-cos.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\frac{\sin a}{\color{blue}{\cos a}}\right)\right)\right) \]
      18. distribute-frac-neg2N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \color{blue}{\frac{\sin a}{\mathsf{neg}\left(\cos a\right)}}\right) \]
      19. lift-neg.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \frac{\sin a}{\color{blue}{-\cos a}}\right) \]
      20. un-div-invN/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \color{blue}{\sin a \cdot \frac{1}{-\cos a}}\right) \]
    6. Applied rewrites80.1%

      \[\leadsto x + \color{blue}{\mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)} \]
  3. Recombined 3 regimes into one program.
  4. Final simplification85.9%

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \leq -9 \cdot 10^{-5}:\\ \;\;\;\;x + \mathsf{fma}\left(\sin \left(y + z\right), {\cos \left(y + z\right)}^{-1}, -\tan a\right)\\ \mathbf{elif}\;a \leq 0.00034:\\ \;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(a - x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\ \end{array} \]
  5. Add Preprocessing

Alternative 6: 89.0% accurate, 0.5× speedup?

\[\begin{array}{l} [x, y, z, a] = \mathsf{sort}([x, y, z, a])\\ \\ \begin{array}{l} \mathbf{if}\;a \leq -8.6 \cdot 10^{-10}:\\ \;\;\;\;x + \mathsf{fma}\left(\sin \left(y + z\right), {\cos \left(y + z\right)}^{-1}, -\tan a\right)\\ \mathbf{elif}\;a \leq 3.6 \cdot 10^{-6}:\\ \;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(-x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\ \end{array} \end{array} \]
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
(FPCore (x y z a)
 :precision binary64
 (if (<= a -8.6e-10)
   (+ x (fma (sin (+ y z)) (pow (cos (+ y z)) -1.0) (- (tan a))))
   (if (<= a 3.6e-6)
     (fma
      (- (+ (tan z) (tan y)))
      (/ -1.0 (fma (- (tan y)) (tan z) 1.0))
      (- (- x)))
     (+ x (fma (/ -1.0 (cos a)) (sin a) (tan (+ y z)))))))
assert(x < y && y < z && z < a);
double code(double x, double y, double z, double a) {
	double tmp;
	if (a <= -8.6e-10) {
		tmp = x + fma(sin((y + z)), pow(cos((y + z)), -1.0), -tan(a));
	} else if (a <= 3.6e-6) {
		tmp = fma(-(tan(z) + tan(y)), (-1.0 / fma(-tan(y), tan(z), 1.0)), -(-x));
	} else {
		tmp = x + fma((-1.0 / cos(a)), sin(a), tan((y + z)));
	}
	return tmp;
}
x, y, z, a = sort([x, y, z, a])
function code(x, y, z, a)
	tmp = 0.0
	if (a <= -8.6e-10)
		tmp = Float64(x + fma(sin(Float64(y + z)), (cos(Float64(y + z)) ^ -1.0), Float64(-tan(a))));
	elseif (a <= 3.6e-6)
		tmp = fma(Float64(-Float64(tan(z) + tan(y))), Float64(-1.0 / fma(Float64(-tan(y)), tan(z), 1.0)), Float64(-Float64(-x)));
	else
		tmp = Float64(x + fma(Float64(-1.0 / cos(a)), sin(a), tan(Float64(y + z))));
	end
	return tmp
end
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
code[x_, y_, z_, a_] := If[LessEqual[a, -8.6e-10], N[(x + N[(N[Sin[N[(y + z), $MachinePrecision]], $MachinePrecision] * N[Power[N[Cos[N[(y + z), $MachinePrecision]], $MachinePrecision], -1.0], $MachinePrecision] + (-N[Tan[a], $MachinePrecision])), $MachinePrecision]), $MachinePrecision], If[LessEqual[a, 3.6e-6], N[((-N[(N[Tan[z], $MachinePrecision] + N[Tan[y], $MachinePrecision]), $MachinePrecision]) * N[(-1.0 / N[((-N[Tan[y], $MachinePrecision]) * N[Tan[z], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision] + (-(-x))), $MachinePrecision], N[(x + N[(N[(-1.0 / N[Cos[a], $MachinePrecision]), $MachinePrecision] * N[Sin[a], $MachinePrecision] + N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
[x, y, z, a] = \mathsf{sort}([x, y, z, a])\\
\\
\begin{array}{l}
\mathbf{if}\;a \leq -8.6 \cdot 10^{-10}:\\
\;\;\;\;x + \mathsf{fma}\left(\sin \left(y + z\right), {\cos \left(y + z\right)}^{-1}, -\tan a\right)\\

\mathbf{elif}\;a \leq 3.6 \cdot 10^{-6}:\\
\;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(-x\right)\right)\\

\mathbf{else}:\\
\;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\


\end{array}
\end{array}
Derivation
  1. Split input into 3 regimes
  2. if a < -8.60000000000000029e-10

    1. Initial program 67.9%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-tan.f64N/A

        \[\leadsto x + \left(\color{blue}{\tan \left(y + z\right)} - \tan a\right) \]
      2. lift-+.f64N/A

        \[\leadsto x + \left(\tan \color{blue}{\left(y + z\right)} - \tan a\right) \]
      3. tan-sumN/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      4. lower-/.f64N/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      5. +-commutativeN/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      6. lower-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      7. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      8. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      9. lower--.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      10. *-commutativeN/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      11. lower-*.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      12. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
      13. lower-tan.f6499.7

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
    4. Applied rewrites99.7%

      \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
    5. Step-by-step derivation
      1. lift-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      2. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      3. tan-quotN/A

        \[\leadsto x + \left(\frac{\color{blue}{\frac{\sin z}{\cos z}} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      4. div-invN/A

        \[\leadsto x + \left(\frac{\color{blue}{\sin z \cdot \frac{1}{\cos z}} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      5. lower-fma.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\mathsf{fma}\left(\sin z, \frac{1}{\cos z}, \tan y\right)}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      6. lower-sin.f64N/A

        \[\leadsto x + \left(\frac{\mathsf{fma}\left(\color{blue}{\sin z}, \frac{1}{\cos z}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      7. inv-powN/A

        \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{{\cos z}^{-1}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      8. lower-pow.f64N/A

        \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, \color{blue}{{\cos z}^{-1}}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      9. lower-cos.f6499.5

        \[\leadsto x + \left(\frac{\mathsf{fma}\left(\sin z, {\color{blue}{\cos z}}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    6. Applied rewrites99.5%

      \[\leadsto x + \left(\frac{\color{blue}{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
    7. Step-by-step derivation
      1. lift--.f64N/A

        \[\leadsto x + \color{blue}{\left(\frac{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} - \tan a\right)} \]
      2. sub-negN/A

        \[\leadsto x + \color{blue}{\left(\frac{\mathsf{fma}\left(\sin z, {\cos z}^{-1}, \tan y\right)}{1 - \tan z \cdot \tan y} + \left(\mathsf{neg}\left(\tan a\right)\right)\right)} \]
    8. Applied rewrites68.0%

      \[\leadsto x + \color{blue}{\mathsf{fma}\left(\sin \left(y + z\right), \frac{1}{\cos \left(y + z\right)}, -\tan a\right)} \]

    if -8.60000000000000029e-10 < a < 3.59999999999999984e-6

    1. Initial program 79.2%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-+.f64N/A

        \[\leadsto \color{blue}{x + \left(\tan \left(y + z\right) - \tan a\right)} \]
      2. +-commutativeN/A

        \[\leadsto \color{blue}{\left(\tan \left(y + z\right) - \tan a\right) + x} \]
      3. lift--.f64N/A

        \[\leadsto \color{blue}{\left(\tan \left(y + z\right) - \tan a\right)} + x \]
      4. associate-+l-N/A

        \[\leadsto \color{blue}{\tan \left(y + z\right) - \left(\tan a - x\right)} \]
      5. lower--.f64N/A

        \[\leadsto \color{blue}{\tan \left(y + z\right) - \left(\tan a - x\right)} \]
      6. lift-+.f64N/A

        \[\leadsto \tan \color{blue}{\left(y + z\right)} - \left(\tan a - x\right) \]
      7. +-commutativeN/A

        \[\leadsto \tan \color{blue}{\left(z + y\right)} - \left(\tan a - x\right) \]
      8. lower-+.f64N/A

        \[\leadsto \tan \color{blue}{\left(z + y\right)} - \left(\tan a - x\right) \]
      9. lower--.f6479.2

        \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(\tan a - x\right)} \]
    4. Applied rewrites79.2%

      \[\leadsto \color{blue}{\tan \left(z + y\right) - \left(\tan a - x\right)} \]
    5. Taylor expanded in x around inf

      \[\leadsto \tan \left(z + y\right) - \color{blue}{-1 \cdot x} \]
    6. Step-by-step derivation
      1. mul-1-negN/A

        \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(\mathsf{neg}\left(x\right)\right)} \]
      2. lower-neg.f6479.2

        \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(-x\right)} \]
    7. Applied rewrites79.2%

      \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(-x\right)} \]
    8. Applied rewrites99.1%

      \[\leadsto \color{blue}{\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{1}{-\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(-x\right)\right)} \]

    if 3.59999999999999984e-6 < a

    1. Initial program 80.0%

      \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-tan.f64N/A

        \[\leadsto x + \left(\color{blue}{\tan \left(y + z\right)} - \tan a\right) \]
      2. lift-+.f64N/A

        \[\leadsto x + \left(\tan \color{blue}{\left(y + z\right)} - \tan a\right) \]
      3. tan-sumN/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      4. lower-/.f64N/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      5. +-commutativeN/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      6. lower-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      7. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      8. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan y \cdot \tan z} - \tan a\right) \]
      9. lower--.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan y \cdot \tan z}} - \tan a\right) \]
      10. *-commutativeN/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      11. lower-*.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      12. lower-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
      13. lower-tan.f6499.6

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
    4. Applied rewrites99.6%

      \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
    5. Step-by-step derivation
      1. lift--.f64N/A

        \[\leadsto x + \color{blue}{\left(\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right)} \]
      2. lift-/.f64N/A

        \[\leadsto x + \left(\color{blue}{\frac{\tan z + \tan y}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
      3. lift-+.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z + \tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      4. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\color{blue}{\tan z} + \tan y}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      5. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \color{blue}{\tan y}}{1 - \tan z \cdot \tan y} - \tan a\right) \]
      6. lift--.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{\color{blue}{1 - \tan z \cdot \tan y}} - \tan a\right) \]
      7. lift-*.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z \cdot \tan y}} - \tan a\right) \]
      8. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \color{blue}{\tan z} \cdot \tan y} - \tan a\right) \]
      9. lift-tan.f64N/A

        \[\leadsto x + \left(\frac{\tan z + \tan y}{1 - \tan z \cdot \color{blue}{\tan y}} - \tan a\right) \]
      10. tan-sum-revN/A

        \[\leadsto x + \left(\color{blue}{\tan \left(z + y\right)} - \tan a\right) \]
      11. lift-+.f64N/A

        \[\leadsto x + \left(\tan \color{blue}{\left(z + y\right)} - \tan a\right) \]
      12. lift-tan.f64N/A

        \[\leadsto x + \left(\color{blue}{\tan \left(z + y\right)} - \tan a\right) \]
      13. sub-negN/A

        \[\leadsto x + \color{blue}{\left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\tan a\right)\right)\right)} \]
      14. lift-tan.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\color{blue}{\tan a}\right)\right)\right) \]
      15. tan-quotN/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\color{blue}{\frac{\sin a}{\cos a}}\right)\right)\right) \]
      16. lift-sin.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\frac{\color{blue}{\sin a}}{\cos a}\right)\right)\right) \]
      17. lift-cos.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \left(\mathsf{neg}\left(\frac{\sin a}{\color{blue}{\cos a}}\right)\right)\right) \]
      18. distribute-frac-neg2N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \color{blue}{\frac{\sin a}{\mathsf{neg}\left(\cos a\right)}}\right) \]
      19. lift-neg.f64N/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \frac{\sin a}{\color{blue}{-\cos a}}\right) \]
      20. un-div-invN/A

        \[\leadsto x + \left(\tan \left(z + y\right) + \color{blue}{\sin a \cdot \frac{1}{-\cos a}}\right) \]
    6. Applied rewrites80.1%

      \[\leadsto x + \color{blue}{\mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)} \]
  3. Recombined 3 regimes into one program.
  4. Final simplification85.5%

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \leq -8.6 \cdot 10^{-10}:\\ \;\;\;\;x + \mathsf{fma}\left(\sin \left(y + z\right), {\cos \left(y + z\right)}^{-1}, -\tan a\right)\\ \mathbf{elif}\;a \leq 3.6 \cdot 10^{-6}:\\ \;\;\;\;\mathsf{fma}\left(-\left(\tan z + \tan y\right), \frac{-1}{\mathsf{fma}\left(-\tan y, \tan z, 1\right)}, -\left(-x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;x + \mathsf{fma}\left(\frac{-1}{\cos a}, \sin a, \tan \left(y + z\right)\right)\\ \end{array} \]
  5. Add Preprocessing

Alternative 7: 78.9% accurate, 1.0× speedup?

\[\begin{array}{l} [x, y, z, a] = \mathsf{sort}([x, y, z, a])\\ \\ x + \left(\tan \left(y + z\right) - \tan a\right) \end{array} \]
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
(FPCore (x y z a) :precision binary64 (+ x (- (tan (+ y z)) (tan a))))
assert(x < y && y < z && z < a);
double code(double x, double y, double z, double a) {
	return x + (tan((y + z)) - tan(a));
}
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
real(8) function code(x, y, z, a)
    real(8), intent (in) :: x
    real(8), intent (in) :: y
    real(8), intent (in) :: z
    real(8), intent (in) :: a
    code = x + (tan((y + z)) - tan(a))
end function
assert x < y && y < z && z < a;
public static double code(double x, double y, double z, double a) {
	return x + (Math.tan((y + z)) - Math.tan(a));
}
[x, y, z, a] = sort([x, y, z, a])
def code(x, y, z, a):
	return x + (math.tan((y + z)) - math.tan(a))
x, y, z, a = sort([x, y, z, a])
function code(x, y, z, a)
	return Float64(x + Float64(tan(Float64(y + z)) - tan(a)))
end
x, y, z, a = num2cell(sort([x, y, z, a])){:}
function tmp = code(x, y, z, a)
	tmp = x + (tan((y + z)) - tan(a));
end
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
code[x_, y_, z_, a_] := N[(x + N[(N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
[x, y, z, a] = \mathsf{sort}([x, y, z, a])\\
\\
x + \left(\tan \left(y + z\right) - \tan a\right)
\end{array}
Derivation
  1. Initial program 76.2%

    \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
  2. Add Preprocessing
  3. Add Preprocessing

Alternative 8: 50.6% accurate, 1.9× speedup?

\[\begin{array}{l} [x, y, z, a] = \mathsf{sort}([x, y, z, a])\\ \\ \tan \left(z + y\right) - \left(-x\right) \end{array} \]
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
(FPCore (x y z a) :precision binary64 (- (tan (+ z y)) (- x)))
assert(x < y && y < z && z < a);
double code(double x, double y, double z, double a) {
	return tan((z + y)) - -x;
}
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
real(8) function code(x, y, z, a)
    real(8), intent (in) :: x
    real(8), intent (in) :: y
    real(8), intent (in) :: z
    real(8), intent (in) :: a
    code = tan((z + y)) - -x
end function
assert x < y && y < z && z < a;
public static double code(double x, double y, double z, double a) {
	return Math.tan((z + y)) - -x;
}
[x, y, z, a] = sort([x, y, z, a])
def code(x, y, z, a):
	return math.tan((z + y)) - -x
x, y, z, a = sort([x, y, z, a])
function code(x, y, z, a)
	return Float64(tan(Float64(z + y)) - Float64(-x))
end
x, y, z, a = num2cell(sort([x, y, z, a])){:}
function tmp = code(x, y, z, a)
	tmp = tan((z + y)) - -x;
end
NOTE: x, y, z, and a should be sorted in increasing order before calling this function.
code[x_, y_, z_, a_] := N[(N[Tan[N[(z + y), $MachinePrecision]], $MachinePrecision] - (-x)), $MachinePrecision]
\begin{array}{l}
[x, y, z, a] = \mathsf{sort}([x, y, z, a])\\
\\
\tan \left(z + y\right) - \left(-x\right)
\end{array}
Derivation
  1. Initial program 76.2%

    \[x + \left(\tan \left(y + z\right) - \tan a\right) \]
  2. Add Preprocessing
  3. Step-by-step derivation
    1. lift-+.f64N/A

      \[\leadsto \color{blue}{x + \left(\tan \left(y + z\right) - \tan a\right)} \]
    2. +-commutativeN/A

      \[\leadsto \color{blue}{\left(\tan \left(y + z\right) - \tan a\right) + x} \]
    3. lift--.f64N/A

      \[\leadsto \color{blue}{\left(\tan \left(y + z\right) - \tan a\right)} + x \]
    4. associate-+l-N/A

      \[\leadsto \color{blue}{\tan \left(y + z\right) - \left(\tan a - x\right)} \]
    5. lower--.f64N/A

      \[\leadsto \color{blue}{\tan \left(y + z\right) - \left(\tan a - x\right)} \]
    6. lift-+.f64N/A

      \[\leadsto \tan \color{blue}{\left(y + z\right)} - \left(\tan a - x\right) \]
    7. +-commutativeN/A

      \[\leadsto \tan \color{blue}{\left(z + y\right)} - \left(\tan a - x\right) \]
    8. lower-+.f64N/A

      \[\leadsto \tan \color{blue}{\left(z + y\right)} - \left(\tan a - x\right) \]
    9. lower--.f6476.2

      \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(\tan a - x\right)} \]
  4. Applied rewrites76.2%

    \[\leadsto \color{blue}{\tan \left(z + y\right) - \left(\tan a - x\right)} \]
  5. Taylor expanded in x around inf

    \[\leadsto \tan \left(z + y\right) - \color{blue}{-1 \cdot x} \]
  6. Step-by-step derivation
    1. mul-1-negN/A

      \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(\mathsf{neg}\left(x\right)\right)} \]
    2. lower-neg.f6449.4

      \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(-x\right)} \]
  7. Applied rewrites49.4%

    \[\leadsto \tan \left(z + y\right) - \color{blue}{\left(-x\right)} \]
  8. Add Preprocessing

Reproduce

?
herbie shell --seed 2024305 
(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))))