
(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:
Herbie found 10 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(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}
(FPCore (x y z a) :precision binary64 (+ x (- (/ (+ (tan y) (tan z)) (- 1.0 (cbrt (pow (* (tan y) (tan z)) 3.0)))) (tan a))))
double code(double x, double y, double z, double a) {
return x + (((tan(y) + tan(z)) / (1.0 - cbrt(pow((tan(y) * tan(z)), 3.0)))) - tan(a));
}
public static double code(double x, double y, double z, double a) {
return x + (((Math.tan(y) + Math.tan(z)) / (1.0 - Math.cbrt(Math.pow((Math.tan(y) * Math.tan(z)), 3.0)))) - Math.tan(a));
}
function code(x, y, z, a) return Float64(x + Float64(Float64(Float64(tan(y) + tan(z)) / Float64(1.0 - cbrt((Float64(tan(y) * tan(z)) ^ 3.0)))) - tan(a))) end
code[x_, y_, z_, a_] := N[(x + N[(N[(N[(N[Tan[y], $MachinePrecision] + N[Tan[z], $MachinePrecision]), $MachinePrecision] / N[(1.0 - N[Power[N[Power[N[(N[Tan[y], $MachinePrecision] * N[Tan[z], $MachinePrecision]), $MachinePrecision], 3.0], $MachinePrecision], 1/3], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x + \left(\frac{\tan y + \tan z}{1 - \sqrt[3]{{\left(\tan y \cdot \tan z\right)}^{3}}} - \tan a\right)
\end{array}
Initial program 80.6%
tan-sum99.8%
div-inv99.7%
Applied egg-rr99.7%
associate-*r/99.8%
*-rgt-identity99.8%
Simplified99.8%
add-cbrt-cube99.8%
Applied egg-rr99.8%
associate-*l*99.8%
cube-unmult99.8%
Simplified99.8%
Final simplification99.8%
(FPCore (x y z a) :precision binary64 (+ x (- (/ (+ (tan y) (tan z)) (- 1.0 (* (tan y) (tan z)))) (tan a))))
double code(double x, double y, double z, double a) {
return x + (((tan(y) + tan(z)) / (1.0 - (tan(y) * tan(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) + tan(z)) / (1.0d0 - (tan(y) * tan(z)))) - tan(a))
end function
public static double code(double x, double y, double z, double a) {
return x + (((Math.tan(y) + Math.tan(z)) / (1.0 - (Math.tan(y) * Math.tan(z)))) - Math.tan(a));
}
def code(x, y, z, a): return x + (((math.tan(y) + math.tan(z)) / (1.0 - (math.tan(y) * math.tan(z)))) - math.tan(a))
function code(x, y, z, a) return Float64(x + Float64(Float64(Float64(tan(y) + tan(z)) / Float64(1.0 - Float64(tan(y) * tan(z)))) - tan(a))) end
function tmp = code(x, y, z, a) tmp = x + (((tan(y) + tan(z)) / (1.0 - (tan(y) * tan(z)))) - tan(a)); end
code[x_, y_, z_, a_] := N[(x + N[(N[(N[(N[Tan[y], $MachinePrecision] + N[Tan[z], $MachinePrecision]), $MachinePrecision] / N[(1.0 - N[(N[Tan[y], $MachinePrecision] * N[Tan[z], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x + \left(\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z} - \tan a\right)
\end{array}
Initial program 80.6%
tan-sum99.8%
div-inv99.7%
Applied egg-rr99.7%
associate-*r/99.8%
*-rgt-identity99.8%
Simplified99.8%
Final simplification99.8%
(FPCore (x y z a) :precision binary64 (if (or (<= a -1.22e-12) (not (<= a 4.5e-13))) (+ x (- (tan (+ y z)) (tan a))) (+ x (- (/ (+ (tan y) (tan z)) (- 1.0 (* (tan y) (tan z)))) a))))
double code(double x, double y, double z, double a) {
double tmp;
if ((a <= -1.22e-12) || !(a <= 4.5e-13)) {
tmp = x + (tan((y + z)) - tan(a));
} else {
tmp = x + (((tan(y) + tan(z)) / (1.0 - (tan(y) * tan(z)))) - a);
}
return tmp;
}
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
real(8) :: tmp
if ((a <= (-1.22d-12)) .or. (.not. (a <= 4.5d-13))) then
tmp = x + (tan((y + z)) - tan(a))
else
tmp = x + (((tan(y) + tan(z)) / (1.0d0 - (tan(y) * tan(z)))) - a)
end if
code = tmp
end function
public static double code(double x, double y, double z, double a) {
double tmp;
if ((a <= -1.22e-12) || !(a <= 4.5e-13)) {
tmp = x + (Math.tan((y + z)) - Math.tan(a));
} else {
tmp = x + (((Math.tan(y) + Math.tan(z)) / (1.0 - (Math.tan(y) * Math.tan(z)))) - a);
}
return tmp;
}
def code(x, y, z, a): tmp = 0 if (a <= -1.22e-12) or not (a <= 4.5e-13): tmp = x + (math.tan((y + z)) - math.tan(a)) else: tmp = x + (((math.tan(y) + math.tan(z)) / (1.0 - (math.tan(y) * math.tan(z)))) - a) return tmp
function code(x, y, z, a) tmp = 0.0 if ((a <= -1.22e-12) || !(a <= 4.5e-13)) tmp = Float64(x + Float64(tan(Float64(y + z)) - tan(a))); else tmp = Float64(x + Float64(Float64(Float64(tan(y) + tan(z)) / Float64(1.0 - Float64(tan(y) * tan(z)))) - a)); end return tmp end
function tmp_2 = code(x, y, z, a) tmp = 0.0; if ((a <= -1.22e-12) || ~((a <= 4.5e-13))) tmp = x + (tan((y + z)) - tan(a)); else tmp = x + (((tan(y) + tan(z)) / (1.0 - (tan(y) * tan(z)))) - a); end tmp_2 = tmp; end
code[x_, y_, z_, a_] := If[Or[LessEqual[a, -1.22e-12], N[Not[LessEqual[a, 4.5e-13]], $MachinePrecision]], N[(x + N[(N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(x + N[(N[(N[(N[Tan[y], $MachinePrecision] + N[Tan[z], $MachinePrecision]), $MachinePrecision] / N[(1.0 - N[(N[Tan[y], $MachinePrecision] * N[Tan[z], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - a), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;a \leq -1.22 \cdot 10^{-12} \lor \neg \left(a \leq 4.5 \cdot 10^{-13}\right):\\
\;\;\;\;x + \left(\tan \left(y + z\right) - \tan a\right)\\
\mathbf{else}:\\
\;\;\;\;x + \left(\frac{\tan y + \tan z}{1 - \tan y \cdot \tan z} - a\right)\\
\end{array}
\end{array}
if a < -1.2200000000000001e-12 or 4.5e-13 < a Initial program 83.0%
if -1.2200000000000001e-12 < a < 4.5e-13Initial program 77.8%
Taylor expanded in a around 0 77.8%
tan-sum99.8%
div-inv99.8%
Applied egg-rr99.8%
associate-*r/99.8%
*-rgt-identity99.8%
Simplified99.8%
Final simplification90.8%
(FPCore (x y z a) :precision binary64 (if (<= (tan a) -1e-31) (- (+ x (tan z)) (tan a)) (if (<= (tan a) 0.01) (+ x (- (tan (+ y z)) a)) (+ (tan z) (- x (tan a))))))
double code(double x, double y, double z, double a) {
double tmp;
if (tan(a) <= -1e-31) {
tmp = (x + tan(z)) - tan(a);
} else if (tan(a) <= 0.01) {
tmp = x + (tan((y + z)) - a);
} else {
tmp = tan(z) + (x - tan(a));
}
return tmp;
}
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
real(8) :: tmp
if (tan(a) <= (-1d-31)) then
tmp = (x + tan(z)) - tan(a)
else if (tan(a) <= 0.01d0) then
tmp = x + (tan((y + z)) - a)
else
tmp = tan(z) + (x - tan(a))
end if
code = tmp
end function
public static double code(double x, double y, double z, double a) {
double tmp;
if (Math.tan(a) <= -1e-31) {
tmp = (x + Math.tan(z)) - Math.tan(a);
} else if (Math.tan(a) <= 0.01) {
tmp = x + (Math.tan((y + z)) - a);
} else {
tmp = Math.tan(z) + (x - Math.tan(a));
}
return tmp;
}
def code(x, y, z, a): tmp = 0 if math.tan(a) <= -1e-31: tmp = (x + math.tan(z)) - math.tan(a) elif math.tan(a) <= 0.01: tmp = x + (math.tan((y + z)) - a) else: tmp = math.tan(z) + (x - math.tan(a)) return tmp
function code(x, y, z, a) tmp = 0.0 if (tan(a) <= -1e-31) tmp = Float64(Float64(x + tan(z)) - tan(a)); elseif (tan(a) <= 0.01) tmp = Float64(x + Float64(tan(Float64(y + z)) - a)); else tmp = Float64(tan(z) + Float64(x - tan(a))); end return tmp end
function tmp_2 = code(x, y, z, a) tmp = 0.0; if (tan(a) <= -1e-31) tmp = (x + tan(z)) - tan(a); elseif (tan(a) <= 0.01) tmp = x + (tan((y + z)) - a); else tmp = tan(z) + (x - tan(a)); end tmp_2 = tmp; end
code[x_, y_, z_, a_] := If[LessEqual[N[Tan[a], $MachinePrecision], -1e-31], N[(N[(x + N[Tan[z], $MachinePrecision]), $MachinePrecision] - N[Tan[a], $MachinePrecision]), $MachinePrecision], If[LessEqual[N[Tan[a], $MachinePrecision], 0.01], N[(x + N[(N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision] - a), $MachinePrecision]), $MachinePrecision], N[(N[Tan[z], $MachinePrecision] + N[(x - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;\tan a \leq -1 \cdot 10^{-31}:\\
\;\;\;\;\left(x + \tan z\right) - \tan a\\
\mathbf{elif}\;\tan a \leq 0.01:\\
\;\;\;\;x + \left(\tan \left(y + z\right) - a\right)\\
\mathbf{else}:\\
\;\;\;\;\tan z + \left(x - \tan a\right)\\
\end{array}
\end{array}
if (tan.f64 a) < -1e-31Initial program 80.9%
Taylor expanded in y around 0 62.5%
tan-quot62.6%
sub-neg62.6%
tan-quot62.6%
Applied egg-rr62.6%
if -1e-31 < (tan.f64 a) < 0.0100000000000000002Initial program 78.3%
Taylor expanded in a around 0 78.0%
if 0.0100000000000000002 < (tan.f64 a) Initial program 83.8%
Taylor expanded in y around 0 63.5%
tan-quot63.5%
tan-quot63.6%
associate--l+63.6%
Applied egg-rr63.6%
Final simplification70.0%
(FPCore (x y z a) :precision binary64 (if (<= (+ y z) -5e-11) (+ x (+ (tan a) (tan (+ y z)))) (+ (tan z) (- x (tan a)))))
double code(double x, double y, double z, double a) {
double tmp;
if ((y + z) <= -5e-11) {
tmp = x + (tan(a) + tan((y + z)));
} else {
tmp = tan(z) + (x - tan(a));
}
return tmp;
}
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
real(8) :: tmp
if ((y + z) <= (-5d-11)) then
tmp = x + (tan(a) + tan((y + z)))
else
tmp = tan(z) + (x - tan(a))
end if
code = tmp
end function
public static double code(double x, double y, double z, double a) {
double tmp;
if ((y + z) <= -5e-11) {
tmp = x + (Math.tan(a) + Math.tan((y + z)));
} else {
tmp = Math.tan(z) + (x - Math.tan(a));
}
return tmp;
}
def code(x, y, z, a): tmp = 0 if (y + z) <= -5e-11: tmp = x + (math.tan(a) + math.tan((y + z))) else: tmp = math.tan(z) + (x - math.tan(a)) return tmp
function code(x, y, z, a) tmp = 0.0 if (Float64(y + z) <= -5e-11) tmp = Float64(x + Float64(tan(a) + tan(Float64(y + z)))); else tmp = Float64(tan(z) + Float64(x - tan(a))); end return tmp end
function tmp_2 = code(x, y, z, a) tmp = 0.0; if ((y + z) <= -5e-11) tmp = x + (tan(a) + tan((y + z))); else tmp = tan(z) + (x - tan(a)); end tmp_2 = tmp; end
code[x_, y_, z_, a_] := If[LessEqual[N[(y + z), $MachinePrecision], -5e-11], N[(x + N[(N[Tan[a], $MachinePrecision] + N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[Tan[z], $MachinePrecision] + N[(x - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y + z \leq -5 \cdot 10^{-11}:\\
\;\;\;\;x + \left(\tan a + \tan \left(y + z\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\tan z + \left(x - \tan a\right)\\
\end{array}
\end{array}
if (+.f64 y z) < -5.00000000000000018e-11Initial program 73.6%
sub-neg73.6%
Applied egg-rr73.6%
+-commutative73.6%
rem-square-sqrt29.4%
fabs-sqr29.4%
rem-square-sqrt54.0%
fabs-neg54.0%
rem-square-sqrt24.6%
fabs-sqr24.6%
rem-square-sqrt45.6%
Simplified45.6%
if -5.00000000000000018e-11 < (+.f64 y z) Initial program 85.4%
Taylor expanded in y around 0 71.0%
tan-quot71.0%
tan-quot71.0%
associate--l+71.0%
Applied egg-rr71.0%
Final simplification60.5%
(FPCore (x y z a) :precision binary64 (if (or (<= a -1.1e-31) (not (<= a 0.0054))) (+ (tan z) (- x (tan a))) (+ x (- (tan (+ y z)) a))))
double code(double x, double y, double z, double a) {
double tmp;
if ((a <= -1.1e-31) || !(a <= 0.0054)) {
tmp = tan(z) + (x - tan(a));
} else {
tmp = x + (tan((y + z)) - a);
}
return tmp;
}
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
real(8) :: tmp
if ((a <= (-1.1d-31)) .or. (.not. (a <= 0.0054d0))) then
tmp = tan(z) + (x - tan(a))
else
tmp = x + (tan((y + z)) - a)
end if
code = tmp
end function
public static double code(double x, double y, double z, double a) {
double tmp;
if ((a <= -1.1e-31) || !(a <= 0.0054)) {
tmp = Math.tan(z) + (x - Math.tan(a));
} else {
tmp = x + (Math.tan((y + z)) - a);
}
return tmp;
}
def code(x, y, z, a): tmp = 0 if (a <= -1.1e-31) or not (a <= 0.0054): tmp = math.tan(z) + (x - math.tan(a)) else: tmp = x + (math.tan((y + z)) - a) return tmp
function code(x, y, z, a) tmp = 0.0 if ((a <= -1.1e-31) || !(a <= 0.0054)) tmp = Float64(tan(z) + Float64(x - tan(a))); else tmp = Float64(x + Float64(tan(Float64(y + z)) - a)); end return tmp end
function tmp_2 = code(x, y, z, a) tmp = 0.0; if ((a <= -1.1e-31) || ~((a <= 0.0054))) tmp = tan(z) + (x - tan(a)); else tmp = x + (tan((y + z)) - a); end tmp_2 = tmp; end
code[x_, y_, z_, a_] := If[Or[LessEqual[a, -1.1e-31], N[Not[LessEqual[a, 0.0054]], $MachinePrecision]], N[(N[Tan[z], $MachinePrecision] + N[(x - N[Tan[a], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(x + N[(N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision] - a), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;a \leq -1.1 \cdot 10^{-31} \lor \neg \left(a \leq 0.0054\right):\\
\;\;\;\;\tan z + \left(x - \tan a\right)\\
\mathbf{else}:\\
\;\;\;\;x + \left(\tan \left(y + z\right) - a\right)\\
\end{array}
\end{array}
if a < -1.10000000000000005e-31 or 0.0054000000000000003 < a Initial program 82.5%
Taylor expanded in y around 0 63.1%
tan-quot63.1%
tan-quot63.1%
associate--l+63.1%
Applied egg-rr63.1%
if -1.10000000000000005e-31 < a < 0.0054000000000000003Initial program 78.3%
Taylor expanded in a around 0 78.0%
Final simplification70.0%
(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}
Initial program 80.6%
Final simplification80.6%
(FPCore (x y z a) :precision binary64 (if (<= a -1.05) (+ x -1.0) (if (<= a 3.1) (+ x (+ a (tan (+ y z)))) x)))
double code(double x, double y, double z, double a) {
double tmp;
if (a <= -1.05) {
tmp = x + -1.0;
} else if (a <= 3.1) {
tmp = x + (a + tan((y + z)));
} else {
tmp = x;
}
return tmp;
}
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
real(8) :: tmp
if (a <= (-1.05d0)) then
tmp = x + (-1.0d0)
else if (a <= 3.1d0) then
tmp = x + (a + tan((y + z)))
else
tmp = x
end if
code = tmp
end function
public static double code(double x, double y, double z, double a) {
double tmp;
if (a <= -1.05) {
tmp = x + -1.0;
} else if (a <= 3.1) {
tmp = x + (a + Math.tan((y + z)));
} else {
tmp = x;
}
return tmp;
}
def code(x, y, z, a): tmp = 0 if a <= -1.05: tmp = x + -1.0 elif a <= 3.1: tmp = x + (a + math.tan((y + z))) else: tmp = x return tmp
function code(x, y, z, a) tmp = 0.0 if (a <= -1.05) tmp = Float64(x + -1.0); elseif (a <= 3.1) tmp = Float64(x + Float64(a + tan(Float64(y + z)))); else tmp = x; end return tmp end
function tmp_2 = code(x, y, z, a) tmp = 0.0; if (a <= -1.05) tmp = x + -1.0; elseif (a <= 3.1) tmp = x + (a + tan((y + z))); else tmp = x; end tmp_2 = tmp; end
code[x_, y_, z_, a_] := If[LessEqual[a, -1.05], N[(x + -1.0), $MachinePrecision], If[LessEqual[a, 3.1], N[(x + N[(a + N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], x]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;a \leq -1.05:\\
\;\;\;\;x + -1\\
\mathbf{elif}\;a \leq 3.1:\\
\;\;\;\;x + \left(a + \tan \left(y + z\right)\right)\\
\mathbf{else}:\\
\;\;\;\;x\\
\end{array}
\end{array}
if a < -1.05000000000000004Initial program 79.9%
Taylor expanded in a around 0 4.9%
expm1-log1p-u4.9%
expm1-udef4.9%
Applied egg-rr4.9%
Taylor expanded in x around inf 21.4%
sub-neg21.4%
unpow-121.4%
remove-double-div21.4%
metadata-eval21.4%
Simplified21.4%
if -1.05000000000000004 < a < 3.10000000000000009Initial program 78.7%
sub-neg78.7%
Applied egg-rr78.7%
+-commutative78.7%
rem-square-sqrt42.9%
fabs-sqr42.9%
rem-square-sqrt78.0%
fabs-neg78.0%
rem-square-sqrt35.1%
fabs-sqr35.1%
rem-square-sqrt77.1%
Simplified77.1%
Taylor expanded in a around 0 77.0%
if 3.10000000000000009 < a Initial program 84.5%
Taylor expanded in x around inf 21.1%
Final simplification48.2%
(FPCore (x y z a) :precision binary64 (if (<= a -1.55) (+ x -1.0) (if (<= a 4.7) (+ x (- (tan (+ y z)) a)) x)))
double code(double x, double y, double z, double a) {
double tmp;
if (a <= -1.55) {
tmp = x + -1.0;
} else if (a <= 4.7) {
tmp = x + (tan((y + z)) - a);
} else {
tmp = x;
}
return tmp;
}
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
real(8) :: tmp
if (a <= (-1.55d0)) then
tmp = x + (-1.0d0)
else if (a <= 4.7d0) then
tmp = x + (tan((y + z)) - a)
else
tmp = x
end if
code = tmp
end function
public static double code(double x, double y, double z, double a) {
double tmp;
if (a <= -1.55) {
tmp = x + -1.0;
} else if (a <= 4.7) {
tmp = x + (Math.tan((y + z)) - a);
} else {
tmp = x;
}
return tmp;
}
def code(x, y, z, a): tmp = 0 if a <= -1.55: tmp = x + -1.0 elif a <= 4.7: tmp = x + (math.tan((y + z)) - a) else: tmp = x return tmp
function code(x, y, z, a) tmp = 0.0 if (a <= -1.55) tmp = Float64(x + -1.0); elseif (a <= 4.7) tmp = Float64(x + Float64(tan(Float64(y + z)) - a)); else tmp = x; end return tmp end
function tmp_2 = code(x, y, z, a) tmp = 0.0; if (a <= -1.55) tmp = x + -1.0; elseif (a <= 4.7) tmp = x + (tan((y + z)) - a); else tmp = x; end tmp_2 = tmp; end
code[x_, y_, z_, a_] := If[LessEqual[a, -1.55], N[(x + -1.0), $MachinePrecision], If[LessEqual[a, 4.7], N[(x + N[(N[Tan[N[(y + z), $MachinePrecision]], $MachinePrecision] - a), $MachinePrecision]), $MachinePrecision], x]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;a \leq -1.55:\\
\;\;\;\;x + -1\\
\mathbf{elif}\;a \leq 4.7:\\
\;\;\;\;x + \left(\tan \left(y + z\right) - a\right)\\
\mathbf{else}:\\
\;\;\;\;x\\
\end{array}
\end{array}
if a < -1.55000000000000004Initial program 79.9%
Taylor expanded in a around 0 4.9%
expm1-log1p-u4.9%
expm1-udef4.9%
Applied egg-rr4.9%
Taylor expanded in x around inf 21.4%
sub-neg21.4%
unpow-121.4%
remove-double-div21.4%
metadata-eval21.4%
Simplified21.4%
if -1.55000000000000004 < a < 4.70000000000000018Initial program 78.7%
Taylor expanded in a around 0 77.7%
if 4.70000000000000018 < a Initial program 84.5%
Taylor expanded in x around inf 21.1%
Final simplification48.6%
(FPCore (x y z a) :precision binary64 x)
double code(double x, double y, double z, double a) {
return x;
}
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
end function
public static double code(double x, double y, double z, double a) {
return x;
}
def code(x, y, z, a): return x
function code(x, y, z, a) return x end
function tmp = code(x, y, z, a) tmp = x; end
code[x_, y_, z_, a_] := x
\begin{array}{l}
\\
x
\end{array}
Initial program 80.6%
Taylor expanded in x around inf 32.6%
Final simplification32.6%
herbie shell --seed 2023199
(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))))