
(FPCore (x) :precision binary64 (/ (- (exp x) (exp (- x))) 2.0))
double code(double x) {
return (exp(x) - exp(-x)) / 2.0;
}
real(8) function code(x)
real(8), intent (in) :: x
code = (exp(x) - exp(-x)) / 2.0d0
end function
public static double code(double x) {
return (Math.exp(x) - Math.exp(-x)) / 2.0;
}
def code(x): return (math.exp(x) - math.exp(-x)) / 2.0
function code(x) return Float64(Float64(exp(x) - exp(Float64(-x))) / 2.0) end
function tmp = code(x) tmp = (exp(x) - exp(-x)) / 2.0; end
code[x_] := N[(N[(N[Exp[x], $MachinePrecision] - N[Exp[(-x)], $MachinePrecision]), $MachinePrecision] / 2.0), $MachinePrecision]
\begin{array}{l}
\\
\frac{e^{x} - e^{-x}}{2}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 6 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x) :precision binary64 (/ (- (exp x) (exp (- x))) 2.0))
double code(double x) {
return (exp(x) - exp(-x)) / 2.0;
}
real(8) function code(x)
real(8), intent (in) :: x
code = (exp(x) - exp(-x)) / 2.0d0
end function
public static double code(double x) {
return (Math.exp(x) - Math.exp(-x)) / 2.0;
}
def code(x): return (math.exp(x) - math.exp(-x)) / 2.0
function code(x) return Float64(Float64(exp(x) - exp(Float64(-x))) / 2.0) end
function tmp = code(x) tmp = (exp(x) - exp(-x)) / 2.0; end
code[x_] := N[(N[(N[Exp[x], $MachinePrecision] - N[Exp[(-x)], $MachinePrecision]), $MachinePrecision] / 2.0), $MachinePrecision]
\begin{array}{l}
\\
\frac{e^{x} - e^{-x}}{2}
\end{array}
(FPCore (x) :precision binary64 (sinh x))
double code(double x) {
return sinh(x);
}
real(8) function code(x)
real(8), intent (in) :: x
code = sinh(x)
end function
public static double code(double x) {
return Math.sinh(x);
}
def code(x): return math.sinh(x)
function code(x) return sinh(x) end
function tmp = code(x) tmp = sinh(x); end
code[x_] := N[Sinh[x], $MachinePrecision]
\begin{array}{l}
\\
\sinh x
\end{array}
Initial program 57.8%
div-sub57.8%
*-rgt-identity57.8%
associate-*l/57.8%
associate-/l*57.8%
fma-neg57.8%
metadata-eval57.8%
exp-neg57.8%
associate-/l/57.8%
associate-/r*57.8%
distribute-neg-frac57.8%
metadata-eval57.8%
metadata-eval57.8%
Simplified57.8%
Taylor expanded in x around inf 57.8%
*-un-lft-identity57.8%
distribute-lft-out--57.8%
rec-exp57.8%
sinh-undef100.0%
Applied egg-rr100.0%
*-lft-identity100.0%
associate-*r*100.0%
metadata-eval100.0%
*-lft-identity100.0%
Simplified100.0%
(FPCore (x) :precision binary64 (* x (+ 1.0 (* (* x x) (+ 0.16666666666666666 (* (* x x) 0.008333333333333333))))))
double code(double x) {
return x * (1.0 + ((x * x) * (0.16666666666666666 + ((x * x) * 0.008333333333333333))));
}
real(8) function code(x)
real(8), intent (in) :: x
code = x * (1.0d0 + ((x * x) * (0.16666666666666666d0 + ((x * x) * 0.008333333333333333d0))))
end function
public static double code(double x) {
return x * (1.0 + ((x * x) * (0.16666666666666666 + ((x * x) * 0.008333333333333333))));
}
def code(x): return x * (1.0 + ((x * x) * (0.16666666666666666 + ((x * x) * 0.008333333333333333))))
function code(x) return Float64(x * Float64(1.0 + Float64(Float64(x * x) * Float64(0.16666666666666666 + Float64(Float64(x * x) * 0.008333333333333333))))) end
function tmp = code(x) tmp = x * (1.0 + ((x * x) * (0.16666666666666666 + ((x * x) * 0.008333333333333333)))); end
code[x_] := N[(x * N[(1.0 + N[(N[(x * x), $MachinePrecision] * N[(0.16666666666666666 + N[(N[(x * x), $MachinePrecision] * 0.008333333333333333), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x \cdot \left(1 + \left(x \cdot x\right) \cdot \left(0.16666666666666666 + \left(x \cdot x\right) \cdot 0.008333333333333333\right)\right)
\end{array}
Initial program 57.8%
div-sub57.8%
*-rgt-identity57.8%
associate-*l/57.8%
associate-/l*57.8%
fma-neg57.8%
metadata-eval57.8%
exp-neg57.8%
associate-/l/57.8%
associate-/r*57.8%
distribute-neg-frac57.8%
metadata-eval57.8%
metadata-eval57.8%
Simplified57.8%
Taylor expanded in x around 0 89.5%
distribute-lft-in89.5%
*-commutative89.5%
associate-+r+89.5%
associate-+r+89.5%
*-commutative89.5%
distribute-lft-in89.5%
*-commutative89.5%
Simplified89.5%
unpow289.5%
Applied egg-rr89.5%
unpow289.5%
Applied egg-rr89.5%
(FPCore (x) :precision binary64 (* x (+ 1.0 (* x (+ 0.25 (* x (* x 0.020833333333333332)))))))
double code(double x) {
return x * (1.0 + (x * (0.25 + (x * (x * 0.020833333333333332)))));
}
real(8) function code(x)
real(8), intent (in) :: x
code = x * (1.0d0 + (x * (0.25d0 + (x * (x * 0.020833333333333332d0)))))
end function
public static double code(double x) {
return x * (1.0 + (x * (0.25 + (x * (x * 0.020833333333333332)))));
}
def code(x): return x * (1.0 + (x * (0.25 + (x * (x * 0.020833333333333332)))))
function code(x) return Float64(x * Float64(1.0 + Float64(x * Float64(0.25 + Float64(x * Float64(x * 0.020833333333333332)))))) end
function tmp = code(x) tmp = x * (1.0 + (x * (0.25 + (x * (x * 0.020833333333333332))))); end
code[x_] := N[(x * N[(1.0 + N[(x * N[(0.25 + N[(x * N[(x * 0.020833333333333332), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x \cdot \left(1 + x \cdot \left(0.25 + x \cdot \left(x \cdot 0.020833333333333332\right)\right)\right)
\end{array}
Initial program 57.8%
Taylor expanded in x around 0 29.0%
mul-1-neg29.0%
unsub-neg29.0%
Simplified29.0%
Taylor expanded in x around 0 66.3%
*-commutative66.3%
Simplified66.3%
Taylor expanded in x around inf 66.3%
Taylor expanded in x around inf 66.3%
(FPCore (x) :precision binary64 (* x (+ 1.0 (* (* x x) 0.16666666666666666))))
double code(double x) {
return x * (1.0 + ((x * x) * 0.16666666666666666));
}
real(8) function code(x)
real(8), intent (in) :: x
code = x * (1.0d0 + ((x * x) * 0.16666666666666666d0))
end function
public static double code(double x) {
return x * (1.0 + ((x * x) * 0.16666666666666666));
}
def code(x): return x * (1.0 + ((x * x) * 0.16666666666666666))
function code(x) return Float64(x * Float64(1.0 + Float64(Float64(x * x) * 0.16666666666666666))) end
function tmp = code(x) tmp = x * (1.0 + ((x * x) * 0.16666666666666666)); end
code[x_] := N[(x * N[(1.0 + N[(N[(x * x), $MachinePrecision] * 0.16666666666666666), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x \cdot \left(1 + \left(x \cdot x\right) \cdot 0.16666666666666666\right)
\end{array}
Initial program 57.8%
div-sub57.8%
*-rgt-identity57.8%
associate-*l/57.8%
associate-/l*57.8%
fma-neg57.8%
metadata-eval57.8%
exp-neg57.8%
associate-/l/57.8%
associate-/r*57.8%
distribute-neg-frac57.8%
metadata-eval57.8%
metadata-eval57.8%
Simplified57.8%
Taylor expanded in x around 0 81.6%
metadata-eval81.6%
cancel-sign-sub-inv81.6%
unpow281.6%
associate-*l*81.6%
*-commutative81.6%
*-commutative81.6%
associate-*l*81.6%
unpow281.6%
cancel-sign-sub-inv81.6%
metadata-eval81.6%
*-commutative81.6%
Simplified81.6%
unpow289.5%
Applied egg-rr81.6%
(FPCore (x) :precision binary64 (* x (+ 1.0 (* x 0.25))))
double code(double x) {
return x * (1.0 + (x * 0.25));
}
real(8) function code(x)
real(8), intent (in) :: x
code = x * (1.0d0 + (x * 0.25d0))
end function
public static double code(double x) {
return x * (1.0 + (x * 0.25));
}
def code(x): return x * (1.0 + (x * 0.25))
function code(x) return Float64(x * Float64(1.0 + Float64(x * 0.25))) end
function tmp = code(x) tmp = x * (1.0 + (x * 0.25)); end
code[x_] := N[(x * N[(1.0 + N[(x * 0.25), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x \cdot \left(1 + x \cdot 0.25\right)
\end{array}
Initial program 57.8%
Taylor expanded in x around 0 29.0%
mul-1-neg29.0%
unsub-neg29.0%
Simplified29.0%
Taylor expanded in x around 0 58.7%
*-commutative58.7%
Simplified58.7%
(FPCore (x) :precision binary64 x)
double code(double x) {
return x;
}
real(8) function code(x)
real(8), intent (in) :: x
code = x
end function
public static double code(double x) {
return x;
}
def code(x): return x
function code(x) return x end
function tmp = code(x) tmp = x; end
code[x_] := x
\begin{array}{l}
\\
x
\end{array}
Initial program 57.8%
div-sub57.8%
*-rgt-identity57.8%
associate-*l/57.8%
associate-/l*57.8%
fma-neg57.8%
metadata-eval57.8%
exp-neg57.8%
associate-/l/57.8%
associate-/r*57.8%
distribute-neg-frac57.8%
metadata-eval57.8%
metadata-eval57.8%
Simplified57.8%
Taylor expanded in x around 0 48.7%
herbie shell --seed 2024129
(FPCore (x)
:name "Hyperbolic sine"
:precision binary64
(/ (- (exp x) (exp (- x))) 2.0))