
(FPCore (x) :precision binary64 (/ 2.0 (+ (exp x) (exp (- x)))))
double code(double x) {
return 2.0 / (exp(x) + exp(-x));
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 / (exp(x) + exp(-x))
end function
public static double code(double x) {
return 2.0 / (Math.exp(x) + Math.exp(-x));
}
def code(x): return 2.0 / (math.exp(x) + math.exp(-x))
function code(x) return Float64(2.0 / Float64(exp(x) + exp(Float64(-x)))) end
function tmp = code(x) tmp = 2.0 / (exp(x) + exp(-x)); end
code[x_] := N[(2.0 / N[(N[Exp[x], $MachinePrecision] + N[Exp[(-x)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{2}{e^{x} + e^{-x}}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 9 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x) :precision binary64 (/ 2.0 (+ (exp x) (exp (- x)))))
double code(double x) {
return 2.0 / (exp(x) + exp(-x));
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 / (exp(x) + exp(-x))
end function
public static double code(double x) {
return 2.0 / (Math.exp(x) + Math.exp(-x));
}
def code(x): return 2.0 / (math.exp(x) + math.exp(-x))
function code(x) return Float64(2.0 / Float64(exp(x) + exp(Float64(-x)))) end
function tmp = code(x) tmp = 2.0 / (exp(x) + exp(-x)); end
code[x_] := N[(2.0 / N[(N[Exp[x], $MachinePrecision] + N[Exp[(-x)], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{2}{e^{x} + e^{-x}}
\end{array}
x_m = (fabs.f64 x) (FPCore (x_m) :precision binary64 (let* ((t_0 (exp (- x_m)))) (/ 2.0 (+ (/ 1.0 t_0) t_0))))
x_m = fabs(x);
double code(double x_m) {
double t_0 = exp(-x_m);
return 2.0 / ((1.0 / t_0) + t_0);
}
x_m = abs(x)
real(8) function code(x_m)
real(8), intent (in) :: x_m
real(8) :: t_0
t_0 = exp(-x_m)
code = 2.0d0 / ((1.0d0 / t_0) + t_0)
end function
x_m = Math.abs(x);
public static double code(double x_m) {
double t_0 = Math.exp(-x_m);
return 2.0 / ((1.0 / t_0) + t_0);
}
x_m = math.fabs(x) def code(x_m): t_0 = math.exp(-x_m) return 2.0 / ((1.0 / t_0) + t_0)
x_m = abs(x) function code(x_m) t_0 = exp(Float64(-x_m)) return Float64(2.0 / Float64(Float64(1.0 / t_0) + t_0)) end
x_m = abs(x); function tmp = code(x_m) t_0 = exp(-x_m); tmp = 2.0 / ((1.0 / t_0) + t_0); end
x_m = N[Abs[x], $MachinePrecision]
code[x$95$m_] := Block[{t$95$0 = N[Exp[(-x$95$m)], $MachinePrecision]}, N[(2.0 / N[(N[(1.0 / t$95$0), $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
x_m = \left|x\right|
\\
\begin{array}{l}
t_0 := e^{-x\_m}\\
\frac{2}{\frac{1}{t\_0} + t\_0}
\end{array}
\end{array}
Initial program 100.0%
/-rgt-identityN/A
clear-numN/A
lift-exp.f64N/A
exp-negN/A
lift-neg.f64N/A
lift-exp.f64N/A
lower-/.f64100.0
Applied rewrites100.0%
x_m = (fabs.f64 x) (FPCore (x_m) :precision binary64 (/ 1.0 (cosh x_m)))
x_m = fabs(x);
double code(double x_m) {
return 1.0 / cosh(x_m);
}
x_m = abs(x)
real(8) function code(x_m)
real(8), intent (in) :: x_m
code = 1.0d0 / cosh(x_m)
end function
x_m = Math.abs(x);
public static double code(double x_m) {
return 1.0 / Math.cosh(x_m);
}
x_m = math.fabs(x) def code(x_m): return 1.0 / math.cosh(x_m)
x_m = abs(x) function code(x_m) return Float64(1.0 / cosh(x_m)) end
x_m = abs(x); function tmp = code(x_m) tmp = 1.0 / cosh(x_m); end
x_m = N[Abs[x], $MachinePrecision] code[x$95$m_] := N[(1.0 / N[Cosh[x$95$m], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
x_m = \left|x\right|
\\
\frac{1}{\cosh x\_m}
\end{array}
Initial program 100.0%
lift-/.f64N/A
clear-numN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lower-/.f64N/A
lower-cosh.f64100.0
Applied rewrites100.0%
x_m = (fabs.f64 x)
(FPCore (x_m)
:precision binary64
(/
1.0
(fma
(*
(fma
(fma (* x_m x_m) 0.001388888888888889 0.041666666666666664)
(* x_m x_m)
0.5)
x_m)
x_m
1.0)))x_m = fabs(x);
double code(double x_m) {
return 1.0 / fma((fma(fma((x_m * x_m), 0.001388888888888889, 0.041666666666666664), (x_m * x_m), 0.5) * x_m), x_m, 1.0);
}
x_m = abs(x) function code(x_m) return Float64(1.0 / fma(Float64(fma(fma(Float64(x_m * x_m), 0.001388888888888889, 0.041666666666666664), Float64(x_m * x_m), 0.5) * x_m), x_m, 1.0)) end
x_m = N[Abs[x], $MachinePrecision] code[x$95$m_] := N[(1.0 / N[(N[(N[(N[(N[(x$95$m * x$95$m), $MachinePrecision] * 0.001388888888888889 + 0.041666666666666664), $MachinePrecision] * N[(x$95$m * x$95$m), $MachinePrecision] + 0.5), $MachinePrecision] * x$95$m), $MachinePrecision] * x$95$m + 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
x_m = \left|x\right|
\\
\frac{1}{\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(x\_m \cdot x\_m, 0.001388888888888889, 0.041666666666666664\right), x\_m \cdot x\_m, 0.5\right) \cdot x\_m, x\_m, 1\right)}
\end{array}
Initial program 100.0%
lift-/.f64N/A
clear-numN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lower-/.f64N/A
lower-cosh.f64100.0
Applied rewrites100.0%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
unpow2N/A
lower-*.f64N/A
unpow2N/A
lower-*.f6491.9
Applied rewrites91.9%
Applied rewrites91.9%
x_m = (fabs.f64 x) (FPCore (x_m) :precision binary64 (/ 1.0 (fma (* (* (fma 0.001388888888888889 (* x_m x_m) 0.041666666666666664) x_m) x_m) (* x_m x_m) 1.0)))
x_m = fabs(x);
double code(double x_m) {
return 1.0 / fma(((fma(0.001388888888888889, (x_m * x_m), 0.041666666666666664) * x_m) * x_m), (x_m * x_m), 1.0);
}
x_m = abs(x) function code(x_m) return Float64(1.0 / fma(Float64(Float64(fma(0.001388888888888889, Float64(x_m * x_m), 0.041666666666666664) * x_m) * x_m), Float64(x_m * x_m), 1.0)) end
x_m = N[Abs[x], $MachinePrecision] code[x$95$m_] := N[(1.0 / N[(N[(N[(N[(0.001388888888888889 * N[(x$95$m * x$95$m), $MachinePrecision] + 0.041666666666666664), $MachinePrecision] * x$95$m), $MachinePrecision] * x$95$m), $MachinePrecision] * N[(x$95$m * x$95$m), $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
x_m = \left|x\right|
\\
\frac{1}{\mathsf{fma}\left(\left(\mathsf{fma}\left(0.001388888888888889, x\_m \cdot x\_m, 0.041666666666666664\right) \cdot x\_m\right) \cdot x\_m, x\_m \cdot x\_m, 1\right)}
\end{array}
Initial program 100.0%
lift-/.f64N/A
clear-numN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lower-/.f64N/A
lower-cosh.f64100.0
Applied rewrites100.0%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
unpow2N/A
lower-*.f64N/A
unpow2N/A
lower-*.f6491.9
Applied rewrites91.9%
Taylor expanded in x around inf
Applied rewrites91.1%
x_m = (fabs.f64 x) (FPCore (x_m) :precision binary64 (if (<= x_m 1.4) (fma (fma 0.20833333333333334 (* x_m x_m) -0.5) (* x_m x_m) 1.0) (/ 1.0 (* (* (fma 0.041666666666666664 (* x_m x_m) 0.5) x_m) x_m))))
x_m = fabs(x);
double code(double x_m) {
double tmp;
if (x_m <= 1.4) {
tmp = fma(fma(0.20833333333333334, (x_m * x_m), -0.5), (x_m * x_m), 1.0);
} else {
tmp = 1.0 / ((fma(0.041666666666666664, (x_m * x_m), 0.5) * x_m) * x_m);
}
return tmp;
}
x_m = abs(x) function code(x_m) tmp = 0.0 if (x_m <= 1.4) tmp = fma(fma(0.20833333333333334, Float64(x_m * x_m), -0.5), Float64(x_m * x_m), 1.0); else tmp = Float64(1.0 / Float64(Float64(fma(0.041666666666666664, Float64(x_m * x_m), 0.5) * x_m) * x_m)); end return tmp end
x_m = N[Abs[x], $MachinePrecision] code[x$95$m_] := If[LessEqual[x$95$m, 1.4], N[(N[(0.20833333333333334 * N[(x$95$m * x$95$m), $MachinePrecision] + -0.5), $MachinePrecision] * N[(x$95$m * x$95$m), $MachinePrecision] + 1.0), $MachinePrecision], N[(1.0 / N[(N[(N[(0.041666666666666664 * N[(x$95$m * x$95$m), $MachinePrecision] + 0.5), $MachinePrecision] * x$95$m), $MachinePrecision] * x$95$m), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
x_m = \left|x\right|
\\
\begin{array}{l}
\mathbf{if}\;x\_m \leq 1.4:\\
\;\;\;\;\mathsf{fma}\left(\mathsf{fma}\left(0.20833333333333334, x\_m \cdot x\_m, -0.5\right), x\_m \cdot x\_m, 1\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\left(\mathsf{fma}\left(0.041666666666666664, x\_m \cdot x\_m, 0.5\right) \cdot x\_m\right) \cdot x\_m}\\
\end{array}
\end{array}
if x < 1.3999999999999999Initial program 100.0%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
sub-negN/A
metadata-evalN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
unpow2N/A
lower-*.f6465.3
Applied rewrites65.3%
if 1.3999999999999999 < x Initial program 100.0%
lift-/.f64N/A
clear-numN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lower-/.f64N/A
lower-cosh.f64100.0
Applied rewrites100.0%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
unpow2N/A
lower-*.f6478.7
Applied rewrites78.7%
Taylor expanded in x around inf
Applied rewrites78.7%
x_m = (fabs.f64 x) (FPCore (x_m) :precision binary64 (/ 1.0 (fma (fma 0.041666666666666664 (* x_m x_m) 0.5) (* x_m x_m) 1.0)))
x_m = fabs(x);
double code(double x_m) {
return 1.0 / fma(fma(0.041666666666666664, (x_m * x_m), 0.5), (x_m * x_m), 1.0);
}
x_m = abs(x) function code(x_m) return Float64(1.0 / fma(fma(0.041666666666666664, Float64(x_m * x_m), 0.5), Float64(x_m * x_m), 1.0)) end
x_m = N[Abs[x], $MachinePrecision] code[x$95$m_] := N[(1.0 / N[(N[(0.041666666666666664 * N[(x$95$m * x$95$m), $MachinePrecision] + 0.5), $MachinePrecision] * N[(x$95$m * x$95$m), $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
x_m = \left|x\right|
\\
\frac{1}{\mathsf{fma}\left(\mathsf{fma}\left(0.041666666666666664, x\_m \cdot x\_m, 0.5\right), x\_m \cdot x\_m, 1\right)}
\end{array}
Initial program 100.0%
lift-/.f64N/A
clear-numN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lower-/.f64N/A
lower-cosh.f64100.0
Applied rewrites100.0%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
unpow2N/A
lower-*.f6487.7
Applied rewrites87.7%
x_m = (fabs.f64 x) (FPCore (x_m) :precision binary64 (/ 1.0 (fma (* 0.041666666666666664 (* x_m x_m)) (* x_m x_m) 1.0)))
x_m = fabs(x);
double code(double x_m) {
return 1.0 / fma((0.041666666666666664 * (x_m * x_m)), (x_m * x_m), 1.0);
}
x_m = abs(x) function code(x_m) return Float64(1.0 / fma(Float64(0.041666666666666664 * Float64(x_m * x_m)), Float64(x_m * x_m), 1.0)) end
x_m = N[Abs[x], $MachinePrecision] code[x$95$m_] := N[(1.0 / N[(N[(0.041666666666666664 * N[(x$95$m * x$95$m), $MachinePrecision]), $MachinePrecision] * N[(x$95$m * x$95$m), $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
x_m = \left|x\right|
\\
\frac{1}{\mathsf{fma}\left(0.041666666666666664 \cdot \left(x\_m \cdot x\_m\right), x\_m \cdot x\_m, 1\right)}
\end{array}
Initial program 100.0%
lift-/.f64N/A
clear-numN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lower-/.f64N/A
lower-cosh.f64100.0
Applied rewrites100.0%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
unpow2N/A
lower-*.f6487.7
Applied rewrites87.7%
Taylor expanded in x around inf
Applied rewrites87.1%
x_m = (fabs.f64 x) (FPCore (x_m) :precision binary64 (/ 2.0 (fma x_m x_m 2.0)))
x_m = fabs(x);
double code(double x_m) {
return 2.0 / fma(x_m, x_m, 2.0);
}
x_m = abs(x) function code(x_m) return Float64(2.0 / fma(x_m, x_m, 2.0)) end
x_m = N[Abs[x], $MachinePrecision] code[x$95$m_] := N[(2.0 / N[(x$95$m * x$95$m + 2.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
x_m = \left|x\right|
\\
\frac{2}{\mathsf{fma}\left(x\_m, x\_m, 2\right)}
\end{array}
Initial program 100.0%
Taylor expanded in x around 0
+-commutativeN/A
unpow2N/A
lower-fma.f6474.6
Applied rewrites74.6%
x_m = (fabs.f64 x) (FPCore (x_m) :precision binary64 1.0)
x_m = fabs(x);
double code(double x_m) {
return 1.0;
}
x_m = abs(x)
real(8) function code(x_m)
real(8), intent (in) :: x_m
code = 1.0d0
end function
x_m = Math.abs(x);
public static double code(double x_m) {
return 1.0;
}
x_m = math.fabs(x) def code(x_m): return 1.0
x_m = abs(x) function code(x_m) return 1.0 end
x_m = abs(x); function tmp = code(x_m) tmp = 1.0; end
x_m = N[Abs[x], $MachinePrecision] code[x$95$m_] := 1.0
\begin{array}{l}
x_m = \left|x\right|
\\
1
\end{array}
Initial program 100.0%
Taylor expanded in x around 0
Applied rewrites46.6%
herbie shell --seed 2024294
(FPCore (x)
:name "Hyperbolic secant"
:precision binary64
(/ 2.0 (+ (exp x) (exp (- x)))))