
(FPCore (x s) :precision binary32 (/ 1.0 (+ 1.0 (exp (/ (- x) s)))))
float code(float x, float s) {
return 1.0f / (1.0f + expf((-x / s)));
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
code = 1.0e0 / (1.0e0 + exp((-x / s)))
end function
function code(x, s) return Float32(Float32(1.0) / Float32(Float32(1.0) + exp(Float32(Float32(-x) / s)))) end
function tmp = code(x, s) tmp = single(1.0) / (single(1.0) + exp((-x / s))); end
\begin{array}{l}
\\
\frac{1}{1 + e^{\frac{-x}{s}}}
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 13 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x s) :precision binary32 (/ 1.0 (+ 1.0 (exp (/ (- x) s)))))
float code(float x, float s) {
return 1.0f / (1.0f + expf((-x / s)));
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
code = 1.0e0 / (1.0e0 + exp((-x / s)))
end function
function code(x, s) return Float32(Float32(1.0) / Float32(Float32(1.0) + exp(Float32(Float32(-x) / s)))) end
function tmp = code(x, s) tmp = single(1.0) / (single(1.0) + exp((-x / s))); end
\begin{array}{l}
\\
\frac{1}{1 + e^{\frac{-x}{s}}}
\end{array}
(FPCore (x s) :precision binary32 (let* ((t_0 (sqrt (/ 1.0 (exp (/ x s)))))) (/ 1.0 (+ 1.0 (* t_0 t_0)))))
float code(float x, float s) {
float t_0 = sqrtf((1.0f / expf((x / s))));
return 1.0f / (1.0f + (t_0 * t_0));
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: t_0
t_0 = sqrt((1.0e0 / exp((x / s))))
code = 1.0e0 / (1.0e0 + (t_0 * t_0))
end function
function code(x, s) t_0 = sqrt(Float32(Float32(1.0) / exp(Float32(x / s)))) return Float32(Float32(1.0) / Float32(Float32(1.0) + Float32(t_0 * t_0))) end
function tmp = code(x, s) t_0 = sqrt((single(1.0) / exp((x / s)))); tmp = single(1.0) / (single(1.0) + (t_0 * t_0)); end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sqrt{\frac{1}{e^{\frac{x}{s}}}}\\
\frac{1}{1 + t\_0 \cdot t\_0}
\end{array}
\end{array}
Initial program 99.7%
unpow1N/A
metadata-evalN/A
sqrt-pow1N/A
pow2N/A
sqr-neg-revN/A
sqr-neg-revN/A
sqrt-prodN/A
lower-*.f32N/A
Applied rewrites99.7%
Final simplification99.7%
(FPCore (x s) :precision binary32 (if (<= (+ 1.0 (exp (/ (- x) s))) 1.0000000200408773e+20) (/ 1.0 (- 1.0 (/ -1.0 (+ (/ x s) 1.0)))) (/ 1.0 (* (+ (/ (+ (/ -1.0 s) (/ 2.0 x)) x) (/ 0.5 (* s s))) (* x x)))))
float code(float x, float s) {
float tmp;
if ((1.0f + expf((-x / s))) <= 1.0000000200408773e+20f) {
tmp = 1.0f / (1.0f - (-1.0f / ((x / s) + 1.0f)));
} else {
tmp = 1.0f / (((((-1.0f / s) + (2.0f / x)) / x) + (0.5f / (s * s))) * (x * x));
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if ((1.0e0 + exp((-x / s))) <= 1.0000000200408773e+20) then
tmp = 1.0e0 / (1.0e0 - ((-1.0e0) / ((x / s) + 1.0e0)))
else
tmp = 1.0e0 / ((((((-1.0e0) / s) + (2.0e0 / x)) / x) + (0.5e0 / (s * s))) * (x * x))
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(1.0) + exp(Float32(Float32(-x) / s))) <= Float32(1.0000000200408773e+20)) tmp = Float32(Float32(1.0) / Float32(Float32(1.0) - Float32(Float32(-1.0) / Float32(Float32(x / s) + Float32(1.0))))); else tmp = Float32(Float32(1.0) / Float32(Float32(Float32(Float32(Float32(Float32(-1.0) / s) + Float32(Float32(2.0) / x)) / x) + Float32(Float32(0.5) / Float32(s * s))) * Float32(x * x))); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if ((single(1.0) + exp((-x / s))) <= single(1.0000000200408773e+20)) tmp = single(1.0) / (single(1.0) - (single(-1.0) / ((x / s) + single(1.0)))); else tmp = single(1.0) / (((((single(-1.0) / s) + (single(2.0) / x)) / x) + (single(0.5) / (s * s))) * (x * x)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;1 + e^{\frac{-x}{s}} \leq 1.0000000200408773 \cdot 10^{+20}:\\
\;\;\;\;\frac{1}{1 - \frac{-1}{\frac{x}{s} + 1}}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\left(\frac{\frac{-1}{s} + \frac{2}{x}}{x} + \frac{0.5}{s \cdot s}\right) \cdot \left(x \cdot x\right)}\\
\end{array}
\end{array}
if (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) < 1.00000002e20Initial program 99.6%
lift-+.f32N/A
*-lft-identityN/A
fp-cancel-sign-sub-invN/A
distribute-lft-neg-inN/A
*-lft-identityN/A
lower--.f32N/A
lift-exp.f32N/A
lift-/.f32N/A
lift-neg.f32N/A
distribute-frac-negN/A
exp-negN/A
distribute-neg-fracN/A
metadata-evalN/A
remove-double-negN/A
lift-neg.f32N/A
distribute-frac-negN/A
lift-/.f32N/A
lower-/.f32N/A
lift-/.f32N/A
distribute-frac-negN/A
Applied rewrites99.6%
Taylor expanded in x around 0
+-commutativeN/A
lower-+.f32N/A
lower-/.f3294.3
Applied rewrites94.3%
if 1.00000002e20 < (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) Initial program 99.8%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
associate-*l/N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f32N/A
lower-/.f326.3
Applied rewrites6.4%
Taylor expanded in x around 0
Applied rewrites6.4%
Taylor expanded in x around -inf
Applied rewrites89.4%
Final simplification92.7%
(FPCore (x s) :precision binary32 (if (<= (+ 1.0 (exp (/ (- x) s))) 1.0000000200408773e+20) 0.5 (/ 1.0 (* (/ 0.5 (* s s)) (* x x)))))
float code(float x, float s) {
float tmp;
if ((1.0f + expf((-x / s))) <= 1.0000000200408773e+20f) {
tmp = 0.5f;
} else {
tmp = 1.0f / ((0.5f / (s * s)) * (x * x));
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if ((1.0e0 + exp((-x / s))) <= 1.0000000200408773e+20) then
tmp = 0.5e0
else
tmp = 1.0e0 / ((0.5e0 / (s * s)) * (x * x))
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(1.0) + exp(Float32(Float32(-x) / s))) <= Float32(1.0000000200408773e+20)) tmp = Float32(0.5); else tmp = Float32(Float32(1.0) / Float32(Float32(Float32(0.5) / Float32(s * s)) * Float32(x * x))); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if ((single(1.0) + exp((-x / s))) <= single(1.0000000200408773e+20)) tmp = single(0.5); else tmp = single(1.0) / ((single(0.5) / (s * s)) * (x * x)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;1 + e^{\frac{-x}{s}} \leq 1.0000000200408773 \cdot 10^{+20}:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{0.5}{s \cdot s} \cdot \left(x \cdot x\right)}\\
\end{array}
\end{array}
if (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) < 1.00000002e20Initial program 99.6%
Taylor expanded in x around 0
Applied rewrites53.8%
if 1.00000002e20 < (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) Initial program 99.8%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
associate-*l/N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f32N/A
lower-/.f326.3
Applied rewrites6.4%
Taylor expanded in x around inf
Applied rewrites89.4%
Taylor expanded in x around inf
Applied rewrites89.4%
Final simplification65.5%
(FPCore (x s) :precision binary32 (if (<= (+ 1.0 (exp (/ (- x) s))) 1.0000000200408773e+20) 0.5 (/ 1.0 (/ (* (- x) s) (* s s)))))
float code(float x, float s) {
float tmp;
if ((1.0f + expf((-x / s))) <= 1.0000000200408773e+20f) {
tmp = 0.5f;
} else {
tmp = 1.0f / ((-x * s) / (s * s));
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if ((1.0e0 + exp((-x / s))) <= 1.0000000200408773e+20) then
tmp = 0.5e0
else
tmp = 1.0e0 / ((-x * s) / (s * s))
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(1.0) + exp(Float32(Float32(-x) / s))) <= Float32(1.0000000200408773e+20)) tmp = Float32(0.5); else tmp = Float32(Float32(1.0) / Float32(Float32(Float32(-x) * s) / Float32(s * s))); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if ((single(1.0) + exp((-x / s))) <= single(1.0000000200408773e+20)) tmp = single(0.5); else tmp = single(1.0) / ((-x * s) / (s * s)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;1 + e^{\frac{-x}{s}} \leq 1.0000000200408773 \cdot 10^{+20}:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{\left(-x\right) \cdot s}{s \cdot s}}\\
\end{array}
\end{array}
if (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) < 1.00000002e20Initial program 99.6%
Taylor expanded in x around 0
Applied rewrites53.8%
if 1.00000002e20 < (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) Initial program 99.8%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
associate-*l/N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f32N/A
lower-/.f326.3
Applied rewrites6.3%
Applied rewrites83.0%
Taylor expanded in s around 0
Applied rewrites85.3%
Taylor expanded in x around 0
Applied rewrites50.7%
(FPCore (x s) :precision binary32 (if (<= (+ 1.0 (exp (/ (- x) s))) 1.5) (/ 1.0 (+ 1.0 (fma (/ -1.0 s) x 1.0))) (/ 1.0 (+ (* (/ -1.0 s) x) 2.0))))
float code(float x, float s) {
float tmp;
if ((1.0f + expf((-x / s))) <= 1.5f) {
tmp = 1.0f / (1.0f + fmaf((-1.0f / s), x, 1.0f));
} else {
tmp = 1.0f / (((-1.0f / s) * x) + 2.0f);
}
return tmp;
}
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(1.0) + exp(Float32(Float32(-x) / s))) <= Float32(1.5)) tmp = Float32(Float32(1.0) / Float32(Float32(1.0) + fma(Float32(Float32(-1.0) / s), x, Float32(1.0)))); else tmp = Float32(Float32(1.0) / Float32(Float32(Float32(Float32(-1.0) / s) * x) + Float32(2.0))); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;1 + e^{\frac{-x}{s}} \leq 1.5:\\
\;\;\;\;\frac{1}{1 + \mathsf{fma}\left(\frac{-1}{s}, x, 1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{-1}{s} \cdot x + 2}\\
\end{array}
\end{array}
if (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) < 1.5Initial program 100.0%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
Applied rewrites28.9%
Taylor expanded in x around 0
Applied rewrites27.9%
if 1.5 < (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) Initial program 99.5%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
associate-*l/N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f32N/A
lower-/.f3244.3
Applied rewrites43.8%
Taylor expanded in x around 0
Applied rewrites44.3%
Applied rewrites63.8%
(FPCore (x s) :precision binary32 (if (<= (+ 1.0 (exp (/ (- x) s))) 1.5) 0.5 (/ 1.0 (+ (* (/ -1.0 s) x) 2.0))))
float code(float x, float s) {
float tmp;
if ((1.0f + expf((-x / s))) <= 1.5f) {
tmp = 0.5f;
} else {
tmp = 1.0f / (((-1.0f / s) * x) + 2.0f);
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if ((1.0e0 + exp((-x / s))) <= 1.5e0) then
tmp = 0.5e0
else
tmp = 1.0e0 / ((((-1.0e0) / s) * x) + 2.0e0)
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(1.0) + exp(Float32(Float32(-x) / s))) <= Float32(1.5)) tmp = Float32(0.5); else tmp = Float32(Float32(1.0) / Float32(Float32(Float32(Float32(-1.0) / s) * x) + Float32(2.0))); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if ((single(1.0) + exp((-x / s))) <= single(1.5)) tmp = single(0.5); else tmp = single(1.0) / (((single(-1.0) / s) * x) + single(2.0)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;1 + e^{\frac{-x}{s}} \leq 1.5:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{-1}{s} \cdot x + 2}\\
\end{array}
\end{array}
if (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) < 1.5Initial program 100.0%
Taylor expanded in x around 0
Applied rewrites28.1%
if 1.5 < (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) Initial program 99.5%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
associate-*l/N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f32N/A
lower-/.f3244.3
Applied rewrites43.8%
Taylor expanded in x around 0
Applied rewrites43.8%
Applied rewrites63.8%
(FPCore (x s) :precision binary32 (if (<= (+ 1.0 (exp (/ (- x) s))) 1.5) 0.5 (/ 1.0 (- 2.0 (/ x s)))))
float code(float x, float s) {
float tmp;
if ((1.0f + expf((-x / s))) <= 1.5f) {
tmp = 0.5f;
} else {
tmp = 1.0f / (2.0f - (x / s));
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if ((1.0e0 + exp((-x / s))) <= 1.5e0) then
tmp = 0.5e0
else
tmp = 1.0e0 / (2.0e0 - (x / s))
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(1.0) + exp(Float32(Float32(-x) / s))) <= Float32(1.5)) tmp = Float32(0.5); else tmp = Float32(Float32(1.0) / Float32(Float32(2.0) - Float32(x / s))); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if ((single(1.0) + exp((-x / s))) <= single(1.5)) tmp = single(0.5); else tmp = single(1.0) / (single(2.0) - (x / s)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;1 + e^{\frac{-x}{s}} \leq 1.5:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{2 - \frac{x}{s}}\\
\end{array}
\end{array}
if (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) < 1.5Initial program 100.0%
Taylor expanded in x around 0
Applied rewrites28.1%
if 1.5 < (+.f32 #s(literal 1 binary32) (exp.f32 (/.f32 (neg.f32 x) s))) Initial program 99.5%
Taylor expanded in x around 0
fp-cancel-sign-sub-invN/A
metadata-evalN/A
*-lft-identityN/A
lower--.f32N/A
lower-/.f3263.8
Applied rewrites63.8%
(FPCore (x s) :precision binary32 (/ 1.0 (- 1.0 (/ -1.0 (exp (/ x s))))))
float code(float x, float s) {
return 1.0f / (1.0f - (-1.0f / expf((x / s))));
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
code = 1.0e0 / (1.0e0 - ((-1.0e0) / exp((x / s))))
end function
function code(x, s) return Float32(Float32(1.0) / Float32(Float32(1.0) - Float32(Float32(-1.0) / exp(Float32(x / s))))) end
function tmp = code(x, s) tmp = single(1.0) / (single(1.0) - (single(-1.0) / exp((x / s)))); end
\begin{array}{l}
\\
\frac{1}{1 - \frac{-1}{e^{\frac{x}{s}}}}
\end{array}
Initial program 99.7%
lift-+.f32N/A
*-lft-identityN/A
fp-cancel-sign-sub-invN/A
distribute-lft-neg-inN/A
*-lft-identityN/A
lower--.f32N/A
lift-exp.f32N/A
lift-/.f32N/A
lift-neg.f32N/A
distribute-frac-negN/A
exp-negN/A
distribute-neg-fracN/A
metadata-evalN/A
remove-double-negN/A
lift-neg.f32N/A
distribute-frac-negN/A
lift-/.f32N/A
lower-/.f32N/A
lift-/.f32N/A
distribute-frac-negN/A
Applied rewrites99.7%
(FPCore (x s) :precision binary32 (/ 1.0 (+ 1.0 (exp (/ (- x) s)))))
float code(float x, float s) {
return 1.0f / (1.0f + expf((-x / s)));
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
code = 1.0e0 / (1.0e0 + exp((-x / s)))
end function
function code(x, s) return Float32(Float32(1.0) / Float32(Float32(1.0) + exp(Float32(Float32(-x) / s)))) end
function tmp = code(x, s) tmp = single(1.0) / (single(1.0) + exp((-x / s))); end
\begin{array}{l}
\\
\frac{1}{1 + e^{\frac{-x}{s}}}
\end{array}
Initial program 99.7%
(FPCore (x s) :precision binary32 (if (<= (/ (- x) s) 50.0) (/ 1.0 (- 1.0 (/ -1.0 (+ (/ x s) 1.0)))) (/ 1.0 (* (- (/ 0.5 (* s s)) (/ (/ 1.0 s) x)) (* x x)))))
float code(float x, float s) {
float tmp;
if ((-x / s) <= 50.0f) {
tmp = 1.0f / (1.0f - (-1.0f / ((x / s) + 1.0f)));
} else {
tmp = 1.0f / (((0.5f / (s * s)) - ((1.0f / s) / x)) * (x * x));
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if ((-x / s) <= 50.0e0) then
tmp = 1.0e0 / (1.0e0 - ((-1.0e0) / ((x / s) + 1.0e0)))
else
tmp = 1.0e0 / (((0.5e0 / (s * s)) - ((1.0e0 / s) / x)) * (x * x))
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(-x) / s) <= Float32(50.0)) tmp = Float32(Float32(1.0) / Float32(Float32(1.0) - Float32(Float32(-1.0) / Float32(Float32(x / s) + Float32(1.0))))); else tmp = Float32(Float32(1.0) / Float32(Float32(Float32(Float32(0.5) / Float32(s * s)) - Float32(Float32(Float32(1.0) / s) / x)) * Float32(x * x))); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if ((-x / s) <= single(50.0)) tmp = single(1.0) / (single(1.0) - (single(-1.0) / ((x / s) + single(1.0)))); else tmp = single(1.0) / (((single(0.5) / (s * s)) - ((single(1.0) / s) / x)) * (x * x)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;\frac{-x}{s} \leq 50:\\
\;\;\;\;\frac{1}{1 - \frac{-1}{\frac{x}{s} + 1}}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\left(\frac{0.5}{s \cdot s} - \frac{\frac{1}{s}}{x}\right) \cdot \left(x \cdot x\right)}\\
\end{array}
\end{array}
if (/.f32 (neg.f32 x) s) < 50Initial program 99.6%
lift-+.f32N/A
*-lft-identityN/A
fp-cancel-sign-sub-invN/A
distribute-lft-neg-inN/A
*-lft-identityN/A
lower--.f32N/A
lift-exp.f32N/A
lift-/.f32N/A
lift-neg.f32N/A
distribute-frac-negN/A
exp-negN/A
distribute-neg-fracN/A
metadata-evalN/A
remove-double-negN/A
lift-neg.f32N/A
distribute-frac-negN/A
lift-/.f32N/A
lower-/.f32N/A
lift-/.f32N/A
distribute-frac-negN/A
Applied rewrites99.6%
Taylor expanded in x around 0
+-commutativeN/A
lower-+.f32N/A
lower-/.f3294.3
Applied rewrites94.3%
if 50 < (/.f32 (neg.f32 x) s) Initial program 99.8%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
associate-*l/N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f32N/A
lower-/.f326.3
Applied rewrites6.4%
Taylor expanded in x around inf
Applied rewrites89.4%
Final simplification92.7%
(FPCore (x s) :precision binary32 (if (<= (/ (- x) s) 50.0) (/ 1.0 (- 1.0 (/ -1.0 (+ (/ x s) 1.0)))) (/ 1.0 (* (/ 0.5 (* s s)) (* x x)))))
float code(float x, float s) {
float tmp;
if ((-x / s) <= 50.0f) {
tmp = 1.0f / (1.0f - (-1.0f / ((x / s) + 1.0f)));
} else {
tmp = 1.0f / ((0.5f / (s * s)) * (x * x));
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if ((-x / s) <= 50.0e0) then
tmp = 1.0e0 / (1.0e0 - ((-1.0e0) / ((x / s) + 1.0e0)))
else
tmp = 1.0e0 / ((0.5e0 / (s * s)) * (x * x))
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(-x) / s) <= Float32(50.0)) tmp = Float32(Float32(1.0) / Float32(Float32(1.0) - Float32(Float32(-1.0) / Float32(Float32(x / s) + Float32(1.0))))); else tmp = Float32(Float32(1.0) / Float32(Float32(Float32(0.5) / Float32(s * s)) * Float32(x * x))); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if ((-x / s) <= single(50.0)) tmp = single(1.0) / (single(1.0) - (single(-1.0) / ((x / s) + single(1.0)))); else tmp = single(1.0) / ((single(0.5) / (s * s)) * (x * x)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;\frac{-x}{s} \leq 50:\\
\;\;\;\;\frac{1}{1 - \frac{-1}{\frac{x}{s} + 1}}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{0.5}{s \cdot s} \cdot \left(x \cdot x\right)}\\
\end{array}
\end{array}
if (/.f32 (neg.f32 x) s) < 50Initial program 99.6%
lift-+.f32N/A
*-lft-identityN/A
fp-cancel-sign-sub-invN/A
distribute-lft-neg-inN/A
*-lft-identityN/A
lower--.f32N/A
lift-exp.f32N/A
lift-/.f32N/A
lift-neg.f32N/A
distribute-frac-negN/A
exp-negN/A
distribute-neg-fracN/A
metadata-evalN/A
remove-double-negN/A
lift-neg.f32N/A
distribute-frac-negN/A
lift-/.f32N/A
lower-/.f32N/A
lift-/.f32N/A
distribute-frac-negN/A
Applied rewrites99.6%
Taylor expanded in x around 0
+-commutativeN/A
lower-+.f32N/A
lower-/.f3294.3
Applied rewrites94.3%
if 50 < (/.f32 (neg.f32 x) s) Initial program 99.8%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
associate-*l/N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f32N/A
lower-/.f326.3
Applied rewrites6.4%
Taylor expanded in x around inf
Applied rewrites89.4%
Taylor expanded in x around inf
Applied rewrites89.4%
Final simplification92.7%
(FPCore (x s) :precision binary32 (let* ((t_0 (/ (- x) s))) (if (<= t_0 0.5) 0.5 (/ 1.0 t_0))))
float code(float x, float s) {
float t_0 = -x / s;
float tmp;
if (t_0 <= 0.5f) {
tmp = 0.5f;
} else {
tmp = 1.0f / t_0;
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: t_0
real(4) :: tmp
t_0 = -x / s
if (t_0 <= 0.5e0) then
tmp = 0.5e0
else
tmp = 1.0e0 / t_0
end if
code = tmp
end function
function code(x, s) t_0 = Float32(Float32(-x) / s) tmp = Float32(0.0) if (t_0 <= Float32(0.5)) tmp = Float32(0.5); else tmp = Float32(Float32(1.0) / t_0); end return tmp end
function tmp_2 = code(x, s) t_0 = -x / s; tmp = single(0.0); if (t_0 <= single(0.5)) tmp = single(0.5); else tmp = single(1.0) / t_0; end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{-x}{s}\\
\mathbf{if}\;t\_0 \leq 0.5:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{t\_0}\\
\end{array}
\end{array}
if (/.f32 (neg.f32 x) s) < 0.5Initial program 99.8%
Taylor expanded in x around 0
Applied rewrites54.5%
if 0.5 < (/.f32 (neg.f32 x) s) Initial program 99.6%
Taylor expanded in x around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
associate-*l/N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f32N/A
lower-/.f326.5
Applied rewrites6.6%
Applied rewrites80.5%
Taylor expanded in s around 0
Applied rewrites82.6%
Taylor expanded in x around 0
Applied rewrites37.6%
(FPCore (x s) :precision binary32 0.5)
float code(float x, float s) {
return 0.5f;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
code = 0.5e0
end function
function code(x, s) return Float32(0.5) end
function tmp = code(x, s) tmp = single(0.5); end
\begin{array}{l}
\\
0.5
\end{array}
Initial program 99.7%
Taylor expanded in x around 0
Applied rewrites38.2%
herbie shell --seed 2024337
(FPCore (x s)
:name "Logistic function"
:precision binary32
:pre (and (<= 0.0 s) (<= s 1.0651631))
(/ 1.0 (+ 1.0 (exp (/ (- x) s)))))