
(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 12 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 (/ 1.0 (+ 1.0 (pow E (/ (- x) s)))))
float code(float x, float s) {
return 1.0f / (1.0f + powf(((float) M_E), (-x / s)));
}
function code(x, s) return Float32(Float32(1.0) / Float32(Float32(1.0) + (Float32(exp(1)) ^ Float32(Float32(-x) / s)))) end
function tmp = code(x, s) tmp = single(1.0) / (single(1.0) + (single(2.71828182845904523536) ^ (-x / s))); end
\begin{array}{l}
\\
\frac{1}{1 + {e}^{\left(\frac{-x}{s}\right)}}
\end{array}
(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 (/ (- x) s)))
(if (<= t_0 -20.0)
(/ -1.0 (+ (/ s x) -1.0))
(if (<= t_0 0.05000000074505806)
(+ 0.5 (* (/ x s) 0.25))
(if (<= t_0 40000000.0)
(/ 1.0 (- 2.0 (/ x s)))
(+ (+ 1.0 (/ s x)) -1.0))))))
float code(float x, float s) {
float t_0 = -x / s;
float tmp;
if (t_0 <= -20.0f) {
tmp = -1.0f / ((s / x) + -1.0f);
} else if (t_0 <= 0.05000000074505806f) {
tmp = 0.5f + ((x / s) * 0.25f);
} else if (t_0 <= 40000000.0f) {
tmp = 1.0f / (2.0f - (x / s));
} else {
tmp = (1.0f + (s / x)) + -1.0f;
}
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 <= (-20.0e0)) then
tmp = (-1.0e0) / ((s / x) + (-1.0e0))
else if (t_0 <= 0.05000000074505806e0) then
tmp = 0.5e0 + ((x / s) * 0.25e0)
else if (t_0 <= 40000000.0e0) then
tmp = 1.0e0 / (2.0e0 - (x / s))
else
tmp = (1.0e0 + (s / x)) + (-1.0e0)
end if
code = tmp
end function
function code(x, s) t_0 = Float32(Float32(-x) / s) tmp = Float32(0.0) if (t_0 <= Float32(-20.0)) tmp = Float32(Float32(-1.0) / Float32(Float32(s / x) + Float32(-1.0))); elseif (t_0 <= Float32(0.05000000074505806)) tmp = Float32(Float32(0.5) + Float32(Float32(x / s) * Float32(0.25))); elseif (t_0 <= Float32(40000000.0)) tmp = Float32(Float32(1.0) / Float32(Float32(2.0) - Float32(x / s))); else tmp = Float32(Float32(Float32(1.0) + Float32(s / x)) + Float32(-1.0)); end return tmp end
function tmp_2 = code(x, s) t_0 = -x / s; tmp = single(0.0); if (t_0 <= single(-20.0)) tmp = single(-1.0) / ((s / x) + single(-1.0)); elseif (t_0 <= single(0.05000000074505806)) tmp = single(0.5) + ((x / s) * single(0.25)); elseif (t_0 <= single(40000000.0)) tmp = single(1.0) / (single(2.0) - (x / s)); else tmp = (single(1.0) + (s / x)) + single(-1.0); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{-x}{s}\\
\mathbf{if}\;t_0 \leq -20:\\
\;\;\;\;\frac{-1}{\frac{s}{x} + -1}\\
\mathbf{elif}\;t_0 \leq 0.05000000074505806:\\
\;\;\;\;0.5 + \frac{x}{s} \cdot 0.25\\
\mathbf{elif}\;t_0 \leq 40000000:\\
\;\;\;\;\frac{1}{2 - \frac{x}{s}}\\
\mathbf{else}:\\
\;\;\;\;\left(1 + \frac{s}{x}\right) + -1\\
\end{array}
\end{array}
(FPCore (x s)
:precision binary32
(let* ((t_0 (/ (- x) s)))
(if (<= t_0 -20.0)
(- 1.0 (/ s x))
(if (<= t_0 0.05000000074505806)
(+ 0.5 (* (/ x s) 0.25))
(/ -1.0 (/ x s))))))
float code(float x, float s) {
float t_0 = -x / s;
float tmp;
if (t_0 <= -20.0f) {
tmp = 1.0f - (s / x);
} else if (t_0 <= 0.05000000074505806f) {
tmp = 0.5f + ((x / s) * 0.25f);
} else {
tmp = -1.0f / (x / s);
}
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 <= (-20.0e0)) then
tmp = 1.0e0 - (s / x)
else if (t_0 <= 0.05000000074505806e0) then
tmp = 0.5e0 + ((x / s) * 0.25e0)
else
tmp = (-1.0e0) / (x / s)
end if
code = tmp
end function
function code(x, s) t_0 = Float32(Float32(-x) / s) tmp = Float32(0.0) if (t_0 <= Float32(-20.0)) tmp = Float32(Float32(1.0) - Float32(s / x)); elseif (t_0 <= Float32(0.05000000074505806)) tmp = Float32(Float32(0.5) + Float32(Float32(x / s) * Float32(0.25))); else tmp = Float32(Float32(-1.0) / Float32(x / s)); end return tmp end
function tmp_2 = code(x, s) t_0 = -x / s; tmp = single(0.0); if (t_0 <= single(-20.0)) tmp = single(1.0) - (s / x); elseif (t_0 <= single(0.05000000074505806)) tmp = single(0.5) + ((x / s) * single(0.25)); else tmp = single(-1.0) / (x / s); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{-x}{s}\\
\mathbf{if}\;t_0 \leq -20:\\
\;\;\;\;1 - \frac{s}{x}\\
\mathbf{elif}\;t_0 \leq 0.05000000074505806:\\
\;\;\;\;0.5 + \frac{x}{s} \cdot 0.25\\
\mathbf{else}:\\
\;\;\;\;\frac{-1}{\frac{x}{s}}\\
\end{array}
\end{array}
(FPCore (x s)
:precision binary32
(let* ((t_0 (/ (- x) s)))
(if (<= t_0 -20.0)
(- 1.0 (/ s x))
(if (<= t_0 0.05000000074505806)
(+ 0.5 (* (/ x s) 0.25))
(+ (+ 1.0 (/ s x)) -1.0)))))
float code(float x, float s) {
float t_0 = -x / s;
float tmp;
if (t_0 <= -20.0f) {
tmp = 1.0f - (s / x);
} else if (t_0 <= 0.05000000074505806f) {
tmp = 0.5f + ((x / s) * 0.25f);
} else {
tmp = (1.0f + (s / x)) + -1.0f;
}
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 <= (-20.0e0)) then
tmp = 1.0e0 - (s / x)
else if (t_0 <= 0.05000000074505806e0) then
tmp = 0.5e0 + ((x / s) * 0.25e0)
else
tmp = (1.0e0 + (s / x)) + (-1.0e0)
end if
code = tmp
end function
function code(x, s) t_0 = Float32(Float32(-x) / s) tmp = Float32(0.0) if (t_0 <= Float32(-20.0)) tmp = Float32(Float32(1.0) - Float32(s / x)); elseif (t_0 <= Float32(0.05000000074505806)) tmp = Float32(Float32(0.5) + Float32(Float32(x / s) * Float32(0.25))); else tmp = Float32(Float32(Float32(1.0) + Float32(s / x)) + Float32(-1.0)); end return tmp end
function tmp_2 = code(x, s) t_0 = -x / s; tmp = single(0.0); if (t_0 <= single(-20.0)) tmp = single(1.0) - (s / x); elseif (t_0 <= single(0.05000000074505806)) tmp = single(0.5) + ((x / s) * single(0.25)); else tmp = (single(1.0) + (s / x)) + single(-1.0); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{-x}{s}\\
\mathbf{if}\;t_0 \leq -20:\\
\;\;\;\;1 - \frac{s}{x}\\
\mathbf{elif}\;t_0 \leq 0.05000000074505806:\\
\;\;\;\;0.5 + \frac{x}{s} \cdot 0.25\\
\mathbf{else}:\\
\;\;\;\;\left(1 + \frac{s}{x}\right) + -1\\
\end{array}
\end{array}
(FPCore (x s)
:precision binary32
(let* ((t_0 (/ (- x) s)))
(if (<= t_0 -20.0)
(/ -1.0 (+ (/ s x) -1.0))
(if (<= t_0 0.05000000074505806)
(+ 0.5 (* (/ x s) 0.25))
(+ (+ 1.0 (/ s x)) -1.0)))))
float code(float x, float s) {
float t_0 = -x / s;
float tmp;
if (t_0 <= -20.0f) {
tmp = -1.0f / ((s / x) + -1.0f);
} else if (t_0 <= 0.05000000074505806f) {
tmp = 0.5f + ((x / s) * 0.25f);
} else {
tmp = (1.0f + (s / x)) + -1.0f;
}
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 <= (-20.0e0)) then
tmp = (-1.0e0) / ((s / x) + (-1.0e0))
else if (t_0 <= 0.05000000074505806e0) then
tmp = 0.5e0 + ((x / s) * 0.25e0)
else
tmp = (1.0e0 + (s / x)) + (-1.0e0)
end if
code = tmp
end function
function code(x, s) t_0 = Float32(Float32(-x) / s) tmp = Float32(0.0) if (t_0 <= Float32(-20.0)) tmp = Float32(Float32(-1.0) / Float32(Float32(s / x) + Float32(-1.0))); elseif (t_0 <= Float32(0.05000000074505806)) tmp = Float32(Float32(0.5) + Float32(Float32(x / s) * Float32(0.25))); else tmp = Float32(Float32(Float32(1.0) + Float32(s / x)) + Float32(-1.0)); end return tmp end
function tmp_2 = code(x, s) t_0 = -x / s; tmp = single(0.0); if (t_0 <= single(-20.0)) tmp = single(-1.0) / ((s / x) + single(-1.0)); elseif (t_0 <= single(0.05000000074505806)) tmp = single(0.5) + ((x / s) * single(0.25)); else tmp = (single(1.0) + (s / x)) + single(-1.0); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{-x}{s}\\
\mathbf{if}\;t_0 \leq -20:\\
\;\;\;\;\frac{-1}{\frac{s}{x} + -1}\\
\mathbf{elif}\;t_0 \leq 0.05000000074505806:\\
\;\;\;\;0.5 + \frac{x}{s} \cdot 0.25\\
\mathbf{else}:\\
\;\;\;\;\left(1 + \frac{s}{x}\right) + -1\\
\end{array}
\end{array}
(FPCore (x s)
:precision binary32
(let* ((t_0 (/ (- x) s)))
(if (<= t_0 -20.0)
(- 1.0 (/ s x))
(if (<= t_0 0.05000000074505806) 0.5 (/ -1.0 (/ x s))))))
float code(float x, float s) {
float t_0 = -x / s;
float tmp;
if (t_0 <= -20.0f) {
tmp = 1.0f - (s / x);
} else if (t_0 <= 0.05000000074505806f) {
tmp = 0.5f;
} else {
tmp = -1.0f / (x / s);
}
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 <= (-20.0e0)) then
tmp = 1.0e0 - (s / x)
else if (t_0 <= 0.05000000074505806e0) then
tmp = 0.5e0
else
tmp = (-1.0e0) / (x / s)
end if
code = tmp
end function
function code(x, s) t_0 = Float32(Float32(-x) / s) tmp = Float32(0.0) if (t_0 <= Float32(-20.0)) tmp = Float32(Float32(1.0) - Float32(s / x)); elseif (t_0 <= Float32(0.05000000074505806)) tmp = Float32(0.5); else tmp = Float32(Float32(-1.0) / Float32(x / s)); end return tmp end
function tmp_2 = code(x, s) t_0 = -x / s; tmp = single(0.0); if (t_0 <= single(-20.0)) tmp = single(1.0) - (s / x); elseif (t_0 <= single(0.05000000074505806)) tmp = single(0.5); else tmp = single(-1.0) / (x / s); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{-x}{s}\\
\mathbf{if}\;t_0 \leq -20:\\
\;\;\;\;1 - \frac{s}{x}\\
\mathbf{elif}\;t_0 \leq 0.05000000074505806:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;\frac{-1}{\frac{x}{s}}\\
\end{array}
\end{array}
(FPCore (x s) :precision binary32 (if (<= (/ (- x) s) 5.0) (/ 1.0 (+ 1.0 (/ 1.0 (+ 1.0 (/ x s))))) (+ (+ 1.0 (/ s x)) -1.0)))
float code(float x, float s) {
float tmp;
if ((-x / s) <= 5.0f) {
tmp = 1.0f / (1.0f + (1.0f / (1.0f + (x / s))));
} else {
tmp = (1.0f + (s / x)) + -1.0f;
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if ((-x / s) <= 5.0e0) then
tmp = 1.0e0 / (1.0e0 + (1.0e0 / (1.0e0 + (x / s))))
else
tmp = (1.0e0 + (s / x)) + (-1.0e0)
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (Float32(Float32(-x) / s) <= Float32(5.0)) tmp = Float32(Float32(1.0) / Float32(Float32(1.0) + Float32(Float32(1.0) / Float32(Float32(1.0) + Float32(x / s))))); else tmp = Float32(Float32(Float32(1.0) + Float32(s / x)) + Float32(-1.0)); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if ((-x / s) <= single(5.0)) tmp = single(1.0) / (single(1.0) + (single(1.0) / (single(1.0) + (x / s)))); else tmp = (single(1.0) + (s / x)) + single(-1.0); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;\frac{-x}{s} \leq 5:\\
\;\;\;\;\frac{1}{1 + \frac{1}{1 + \frac{x}{s}}}\\
\mathbf{else}:\\
\;\;\;\;\left(1 + \frac{s}{x}\right) + -1\\
\end{array}
\end{array}
(FPCore (x s) :precision binary32 (if (<= x -4.999999873689376e-5) (* s (/ 1.0 x)) (if (<= x 3.300000043734465e-14) 0.5 (- 1.0 (/ s x)))))
float code(float x, float s) {
float tmp;
if (x <= -4.999999873689376e-5f) {
tmp = s * (1.0f / x);
} else if (x <= 3.300000043734465e-14f) {
tmp = 0.5f;
} else {
tmp = 1.0f - (s / x);
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if (x <= (-4.999999873689376e-5)) then
tmp = s * (1.0e0 / x)
else if (x <= 3.300000043734465e-14) then
tmp = 0.5e0
else
tmp = 1.0e0 - (s / x)
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (x <= Float32(-4.999999873689376e-5)) tmp = Float32(s * Float32(Float32(1.0) / x)); elseif (x <= Float32(3.300000043734465e-14)) tmp = Float32(0.5); else tmp = Float32(Float32(1.0) - Float32(s / x)); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if (x <= single(-4.999999873689376e-5)) tmp = s * (single(1.0) / x); elseif (x <= single(3.300000043734465e-14)) tmp = single(0.5); else tmp = single(1.0) - (s / x); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -4.999999873689376 \cdot 10^{-5}:\\
\;\;\;\;s \cdot \frac{1}{x}\\
\mathbf{elif}\;x \leq 3.300000043734465 \cdot 10^{-14}:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;1 - \frac{s}{x}\\
\end{array}
\end{array}
(FPCore (x s) :precision binary32 (if (<= x -4.999999873689376e-5) (* s (/ 1.0 x)) 0.5))
float code(float x, float s) {
float tmp;
if (x <= -4.999999873689376e-5f) {
tmp = s * (1.0f / x);
} else {
tmp = 0.5f;
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if (x <= (-4.999999873689376e-5)) then
tmp = s * (1.0e0 / x)
else
tmp = 0.5e0
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (x <= Float32(-4.999999873689376e-5)) tmp = Float32(s * Float32(Float32(1.0) / x)); else tmp = Float32(0.5); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if (x <= single(-4.999999873689376e-5)) tmp = s * (single(1.0) / x); else tmp = single(0.5); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -4.999999873689376 \cdot 10^{-5}:\\
\;\;\;\;s \cdot \frac{1}{x}\\
\mathbf{else}:\\
\;\;\;\;0.5\\
\end{array}
\end{array}
(FPCore (x s) :precision binary32 (if (<= x -4.999999873689376e-5) (/ s x) 0.5))
float code(float x, float s) {
float tmp;
if (x <= -4.999999873689376e-5f) {
tmp = s / x;
} else {
tmp = 0.5f;
}
return tmp;
}
real(4) function code(x, s)
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: tmp
if (x <= (-4.999999873689376e-5)) then
tmp = s / x
else
tmp = 0.5e0
end if
code = tmp
end function
function code(x, s) tmp = Float32(0.0) if (x <= Float32(-4.999999873689376e-5)) tmp = Float32(s / x); else tmp = Float32(0.5); end return tmp end
function tmp_2 = code(x, s) tmp = single(0.0); if (x <= single(-4.999999873689376e-5)) tmp = s / x; else tmp = single(0.5); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -4.999999873689376 \cdot 10^{-5}:\\
\;\;\;\;\frac{s}{x}\\
\mathbf{else}:\\
\;\;\;\;0.5\\
\end{array}
\end{array}
(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}
herbie shell --seed 2024006
(FPCore (x s)
:name "Logistic function"
:precision binary32
:pre (and (<= 0.0 s) (<= s 1.0651631))
(/ 1.0 (+ 1.0 (exp (/ (- x) s)))))