
(FPCore (x s) :precision binary32 (let* ((t_0 (exp (/ (- (fabs x)) s))) (t_1 (+ 1.0 t_0))) (/ t_0 (* (* s t_1) t_1))))
float code(float x, float s) {
float t_0 = expf((-fabsf(x) / s));
float t_1 = 1.0f + t_0;
return t_0 / ((s * t_1) * t_1);
}
real(4) function code(x, s)
use fmin_fmax_functions
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: t_0
real(4) :: t_1
t_0 = exp((-abs(x) / s))
t_1 = 1.0e0 + t_0
code = t_0 / ((s * t_1) * t_1)
end function
function code(x, s) t_0 = exp(Float32(Float32(-abs(x)) / s)) t_1 = Float32(Float32(1.0) + t_0) return Float32(t_0 / Float32(Float32(s * t_1) * t_1)) end
function tmp = code(x, s) t_0 = exp((-abs(x) / s)); t_1 = single(1.0) + t_0; tmp = t_0 / ((s * t_1) * t_1); end
\begin{array}{l}
t_0 := e^{\frac{-\left|x\right|}{s}}\\
t_1 := 1 + t\_0\\
\frac{t\_0}{\left(s \cdot t\_1\right) \cdot t\_1}
\end{array}
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x s) :precision binary32 (let* ((t_0 (exp (/ (- (fabs x)) s))) (t_1 (+ 1.0 t_0))) (/ t_0 (* (* s t_1) t_1))))
float code(float x, float s) {
float t_0 = expf((-fabsf(x) / s));
float t_1 = 1.0f + t_0;
return t_0 / ((s * t_1) * t_1);
}
real(4) function code(x, s)
use fmin_fmax_functions
real(4), intent (in) :: x
real(4), intent (in) :: s
real(4) :: t_0
real(4) :: t_1
t_0 = exp((-abs(x) / s))
t_1 = 1.0e0 + t_0
code = t_0 / ((s * t_1) * t_1)
end function
function code(x, s) t_0 = exp(Float32(Float32(-abs(x)) / s)) t_1 = Float32(Float32(1.0) + t_0) return Float32(t_0 / Float32(Float32(s * t_1) * t_1)) end
function tmp = code(x, s) t_0 = exp((-abs(x) / s)); t_1 = single(1.0) + t_0; tmp = t_0 / ((s * t_1) * t_1); end
\begin{array}{l}
t_0 := e^{\frac{-\left|x\right|}{s}}\\
t_1 := 1 + t\_0\\
\frac{t\_0}{\left(s \cdot t\_1\right) \cdot t\_1}
\end{array}
(FPCore (x s) :precision binary32 (let* ((t_0 (/ (- (fabs x)) s)) (t_1 (expm1 t_0))) (/ (exp t_0) (fma (- t_1 -1.0) (* (+ 3.0 t_1) s) s))))
float code(float x, float s) {
float t_0 = -fabsf(x) / s;
float t_1 = expm1f(t_0);
return expf(t_0) / fmaf((t_1 - -1.0f), ((3.0f + t_1) * s), s);
}
function code(x, s) t_0 = Float32(Float32(-abs(x)) / s) t_1 = expm1(t_0) return Float32(exp(t_0) / fma(Float32(t_1 - Float32(-1.0)), Float32(Float32(Float32(3.0) + t_1) * s), s)) end
\begin{array}{l}
t_0 := \frac{-\left|x\right|}{s}\\
t_1 := \mathsf{expm1}\left(t\_0\right)\\
\frac{e^{t\_0}}{\mathsf{fma}\left(t\_1 - -1, \left(3 + t\_1\right) \cdot s, s\right)}
\end{array}
Initial program 99.5%
Applied rewrites99.5%
Applied rewrites99.6%
(FPCore (x s) :precision binary32 (let* ((t_0 (/ (- (fabs x)) s)) (t_1 (expm1 t_0))) (/ (exp t_0) (fma (+ 3.0 t_1) (fma t_1 s s) s))))
float code(float x, float s) {
float t_0 = -fabsf(x) / s;
float t_1 = expm1f(t_0);
return expf(t_0) / fmaf((3.0f + t_1), fmaf(t_1, s, s), s);
}
function code(x, s) t_0 = Float32(Float32(-abs(x)) / s) t_1 = expm1(t_0) return Float32(exp(t_0) / fma(Float32(Float32(3.0) + t_1), fma(t_1, s, s), s)) end
\begin{array}{l}
t_0 := \frac{-\left|x\right|}{s}\\
t_1 := \mathsf{expm1}\left(t\_0\right)\\
\frac{e^{t\_0}}{\mathsf{fma}\left(3 + t\_1, \mathsf{fma}\left(t\_1, s, s\right), s\right)}
\end{array}
Initial program 99.5%
Applied rewrites99.5%
Applied rewrites99.6%
(FPCore (x s) :precision binary32 (let* ((t_0 (/ (- (fabs x)) s)) (t_1 (- -2.0 (expm1 t_0)))) (/ (exp t_0) (* (* t_1 t_1) s))))
float code(float x, float s) {
float t_0 = -fabsf(x) / s;
float t_1 = -2.0f - expm1f(t_0);
return expf(t_0) / ((t_1 * t_1) * s);
}
function code(x, s) t_0 = Float32(Float32(-abs(x)) / s) t_1 = Float32(Float32(-2.0) - expm1(t_0)) return Float32(exp(t_0) / Float32(Float32(t_1 * t_1) * s)) end
\begin{array}{l}
t_0 := \frac{-\left|x\right|}{s}\\
t_1 := -2 - \mathsf{expm1}\left(t\_0\right)\\
\frac{e^{t\_0}}{\left(t\_1 \cdot t\_1\right) \cdot s}
\end{array}
Initial program 99.5%
Applied rewrites99.5%
Applied rewrites99.5%
(FPCore (x s) :precision binary32 (let* ((t_0 (expm1 (/ (- (fabs x)) s))) (t_1 (- t_0 -2.0))) (/ (- t_0 -1.0) (* (* t_1 s) t_1))))
float code(float x, float s) {
float t_0 = expm1f((-fabsf(x) / s));
float t_1 = t_0 - -2.0f;
return (t_0 - -1.0f) / ((t_1 * s) * t_1);
}
function code(x, s) t_0 = expm1(Float32(Float32(-abs(x)) / s)) t_1 = Float32(t_0 - Float32(-2.0)) return Float32(Float32(t_0 - Float32(-1.0)) / Float32(Float32(t_1 * s) * t_1)) end
\begin{array}{l}
t_0 := \mathsf{expm1}\left(\frac{-\left|x\right|}{s}\right)\\
t_1 := t\_0 - -2\\
\frac{t\_0 - -1}{\left(t\_1 \cdot s\right) \cdot t\_1}
\end{array}
Initial program 99.5%
Applied rewrites98.5%
Applied rewrites98.6%
Applied rewrites98.6%
Applied rewrites98.6%
(FPCore (x s) :precision binary32 (let* ((t_0 (/ (- (fabs x)) s))) (/ (exp t_0) (fma (- (expm1 t_0) -1.0) (* 3.0 s) s))))
float code(float x, float s) {
float t_0 = -fabsf(x) / s;
return expf(t_0) / fmaf((expm1f(t_0) - -1.0f), (3.0f * s), s);
}
function code(x, s) t_0 = Float32(Float32(-abs(x)) / s) return Float32(exp(t_0) / fma(Float32(expm1(t_0) - Float32(-1.0)), Float32(Float32(3.0) * s), s)) end
\begin{array}{l}
t_0 := \frac{-\left|x\right|}{s}\\
\frac{e^{t\_0}}{\mathsf{fma}\left(\mathsf{expm1}\left(t\_0\right) - -1, 3 \cdot s, s\right)}
\end{array}
Initial program 99.5%
Applied rewrites99.5%
Applied rewrites99.6%
Taylor expanded in s around inf
Applied rewrites96.5%
(FPCore (x s) :precision binary32 (/ (exp (/ (- (fabs x)) s)) (* 4.0 s)))
float code(float x, float s) {
return expf((-fabsf(x) / s)) / (4.0f * s);
}
real(4) function code(x, s)
use fmin_fmax_functions
real(4), intent (in) :: x
real(4), intent (in) :: s
code = exp((-abs(x) / s)) / (4.0e0 * s)
end function
function code(x, s) return Float32(exp(Float32(Float32(-abs(x)) / s)) / Float32(Float32(4.0) * s)) end
function tmp = code(x, s) tmp = exp((-abs(x) / s)) / (single(4.0) * s); end
\frac{e^{\frac{-\left|x\right|}{s}}}{4 \cdot s}
Initial program 99.5%
Taylor expanded in s around inf
lower-*.f3295.1%
Applied rewrites95.1%
(FPCore (x s) :precision binary32 (/ 1.0 (* (- 1.0 -1.0) (+ s s))))
float code(float x, float s) {
return 1.0f / ((1.0f - -1.0f) * (s + s));
}
real(4) function code(x, s)
use fmin_fmax_functions
real(4), intent (in) :: x
real(4), intent (in) :: s
code = 1.0e0 / ((1.0e0 - (-1.0e0)) * (s + s))
end function
function code(x, s) return Float32(Float32(1.0) / Float32(Float32(Float32(1.0) - Float32(-1.0)) * Float32(s + s))) end
function tmp = code(x, s) tmp = single(1.0) / ((single(1.0) - single(-1.0)) * (s + s)); end
\frac{1}{\left(1 - -1\right) \cdot \left(s + s\right)}
Initial program 99.5%
Taylor expanded in s around inf
lower-*.f3295.4%
Applied rewrites95.4%
Taylor expanded in s around inf
Applied rewrites25.2%
Taylor expanded in s around inf
Applied rewrites26.7%
lift-*.f32N/A
*-commutativeN/A
lower-*.f3226.7%
lift-+.f32N/A
+-commutativeN/A
add-flipN/A
metadata-evalN/A
lower--.f3226.7%
lift-*.f32N/A
count-2-revN/A
lower-+.f3226.7%
Applied rewrites26.7%
herbie shell --seed 2025322
(FPCore (x s)
:name "Logistic distribution"
:precision binary32
:pre (and (<= 0.0 s) (<= s 1.0651631))
(/ (exp (/ (- (fabs x)) s)) (* (* s (+ 1.0 (exp (/ (- (fabs x)) s)))) (+ 1.0 (exp (/ (- (fabs x)) s))))))