
(FPCore (x tau) :precision binary32 (let* ((t_1 (* (* x PI) tau))) (* (/ (sin t_1) t_1) (/ (sin (* x PI)) (* x PI)))))
float code(float x, float tau) {
float t_1 = (x * ((float) M_PI)) * tau;
return (sinf(t_1) / t_1) * (sinf((x * ((float) M_PI))) / (x * ((float) M_PI)));
}
function code(x, tau) t_1 = Float32(Float32(x * Float32(pi)) * tau) return Float32(Float32(sin(t_1) / t_1) * Float32(sin(Float32(x * Float32(pi))) / Float32(x * Float32(pi)))) end
function tmp = code(x, tau) t_1 = (x * single(pi)) * tau; tmp = (sin(t_1) / t_1) * (sin((x * single(pi))) / (x * single(pi))); end
\begin{array}{l}
t_1 := \left(x \cdot \pi\right) \cdot tau\\
\frac{\sin t\_1}{t\_1} \cdot \frac{\sin \left(x \cdot \pi\right)}{x \cdot \pi}
\end{array}
Herbie found 6 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x tau) :precision binary32 (let* ((t_1 (* (* x PI) tau))) (* (/ (sin t_1) t_1) (/ (sin (* x PI)) (* x PI)))))
float code(float x, float tau) {
float t_1 = (x * ((float) M_PI)) * tau;
return (sinf(t_1) / t_1) * (sinf((x * ((float) M_PI))) / (x * ((float) M_PI)));
}
function code(x, tau) t_1 = Float32(Float32(x * Float32(pi)) * tau) return Float32(Float32(sin(t_1) / t_1) * Float32(sin(Float32(x * Float32(pi))) / Float32(x * Float32(pi)))) end
function tmp = code(x, tau) t_1 = (x * single(pi)) * tau; tmp = (sin(t_1) / t_1) * (sin((x * single(pi))) / (x * single(pi))); end
\begin{array}{l}
t_1 := \left(x \cdot \pi\right) \cdot tau\\
\frac{\sin t\_1}{t\_1} \cdot \frac{\sin \left(x \cdot \pi\right)}{x \cdot \pi}
\end{array}
(FPCore (x tau) :precision binary32 (let* ((t_1 (* (* tau x) PI))) (* (/ (sin t_1) t_1) (/ (sin (* x PI)) (* x PI)))))
float code(float x, float tau) {
float t_1 = (tau * x) * ((float) M_PI);
return (sinf(t_1) / t_1) * (sinf((x * ((float) M_PI))) / (x * ((float) M_PI)));
}
function code(x, tau) t_1 = Float32(Float32(tau * x) * Float32(pi)) return Float32(Float32(sin(t_1) / t_1) * Float32(sin(Float32(x * Float32(pi))) / Float32(x * Float32(pi)))) end
function tmp = code(x, tau) t_1 = (tau * x) * single(pi); tmp = (sin(t_1) / t_1) * (sin((x * single(pi))) / (x * single(pi))); end
\begin{array}{l}
t_1 := \left(tau \cdot x\right) \cdot \pi\\
\frac{\sin t\_1}{t\_1} \cdot \frac{\sin \left(x \cdot \pi\right)}{x \cdot \pi}
\end{array}
Initial program 97.9%
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
*-commutativeN/A
associate-*r*N/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f3297.3%
Applied rewrites97.3%
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
*-commutativeN/A
associate-*r*N/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f3297.9%
Applied rewrites97.9%
(FPCore (x tau) :precision binary32 (let* ((t_1 (* tau (* PI x)))) (* (/ 1.0 (/ t_1 (sin t_1))) 1.0)))
float code(float x, float tau) {
float t_1 = tau * (((float) M_PI) * x);
return (1.0f / (t_1 / sinf(t_1))) * 1.0f;
}
function code(x, tau) t_1 = Float32(tau * Float32(Float32(pi) * x)) return Float32(Float32(Float32(1.0) / Float32(t_1 / sin(t_1))) * Float32(1.0)) end
function tmp = code(x, tau) t_1 = tau * (single(pi) * x); tmp = (single(1.0) / (t_1 / sin(t_1))) * single(1.0); end
\begin{array}{l}
t_1 := tau \cdot \left(\pi \cdot x\right)\\
\frac{1}{\frac{t\_1}{\sin t\_1}} \cdot 1
\end{array}
Initial program 97.9%
lift-/.f32N/A
frac-2negN/A
frac-2negN/A
div-flipN/A
remove-double-negN/A
remove-double-negN/A
lower-/.f32N/A
lower-/.f3297.7%
lift-*.f32N/A
*-commutativeN/A
lower-*.f3297.7%
lift-*.f32N/A
*-commutativeN/A
lower-*.f3297.7%
lift-*.f32N/A
*-commutativeN/A
lower-*.f3297.7%
lift-*.f32N/A
*-commutativeN/A
lower-*.f3297.7%
Applied rewrites97.7%
Taylor expanded in x around 0
Applied rewrites70.9%
(FPCore (x tau)
:precision binary32
(let* ((t_1 (* (* x PI) tau)))
(if (<=
(* (/ (sin t_1) t_1) (/ (sin (* x PI)) (* x PI)))
0.9999949932098389)
(* (/ (cos (* (fma tau x -0.5) PI)) t_1) 1.0)
(/ 1.0 (/ (* PI x) (* (sin (* PI x)) 1.0))))))float code(float x, float tau) {
float t_1 = (x * ((float) M_PI)) * tau;
float tmp;
if (((sinf(t_1) / t_1) * (sinf((x * ((float) M_PI))) / (x * ((float) M_PI)))) <= 0.9999949932098389f) {
tmp = (cosf((fmaf(tau, x, -0.5f) * ((float) M_PI))) / t_1) * 1.0f;
} else {
tmp = 1.0f / ((((float) M_PI) * x) / (sinf((((float) M_PI) * x)) * 1.0f));
}
return tmp;
}
function code(x, tau) t_1 = Float32(Float32(x * Float32(pi)) * tau) tmp = Float32(0.0) if (Float32(Float32(sin(t_1) / t_1) * Float32(sin(Float32(x * Float32(pi))) / Float32(x * Float32(pi)))) <= Float32(0.9999949932098389)) tmp = Float32(Float32(cos(Float32(fma(tau, x, Float32(-0.5)) * Float32(pi))) / t_1) * Float32(1.0)); else tmp = Float32(Float32(1.0) / Float32(Float32(Float32(pi) * x) / Float32(sin(Float32(Float32(pi) * x)) * Float32(1.0)))); end return tmp end
\begin{array}{l}
t_1 := \left(x \cdot \pi\right) \cdot tau\\
\mathbf{if}\;\frac{\sin t\_1}{t\_1} \cdot \frac{\sin \left(x \cdot \pi\right)}{x \cdot \pi} \leq 0.9999949932098389:\\
\;\;\;\;\frac{\cos \left(\mathsf{fma}\left(tau, x, -0.5\right) \cdot \pi\right)}{t\_1} \cdot 1\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{\pi \cdot x}{\sin \left(\pi \cdot x\right) \cdot 1}}\\
\end{array}
if (*.f32 (/.f32 (sin.f32 (*.f32 (*.f32 x (PI.f32)) tau)) (*.f32 (*.f32 x (PI.f32)) tau)) (/.f32 (sin.f32 (*.f32 x (PI.f32))) (*.f32 x (PI.f32)))) < 0.999994993Initial program 97.9%
remove-double-negN/A
lift-sin.f32N/A
sin-neg-revN/A
cos-+PI/2-revN/A
lower-cos.f32N/A
lift-*.f32N/A
lift-*.f32N/A
*-commutativeN/A
associate-*l*N/A
distribute-rgt-neg-inN/A
lift-PI.f32N/A
mult-flipN/A
metadata-evalN/A
distribute-lft-outN/A
lower-*.f32N/A
distribute-lft-neg-outN/A
lower-fma.f32N/A
lower-neg.f3283.0%
Applied rewrites83.0%
lift-cos.f32N/A
cos-neg-revN/A
lower-cos.f32N/A
lift-*.f32N/A
*-commutativeN/A
distribute-lft-neg-outN/A
lift-fma.f32N/A
lift-*.f32N/A
add-flipN/A
sub-negate-revN/A
lower-*.f32N/A
sub-negate-revN/A
add-flipN/A
distribute-neg-inN/A
lift-*.f32N/A
lift-neg.f32N/A
distribute-lft-neg-outN/A
remove-double-negN/A
*-commutativeN/A
lower-fma.f32N/A
metadata-eval83.0%
Applied rewrites83.0%
Taylor expanded in x around 0
Applied rewrites60.7%
if 0.999994993 < (*.f32 (/.f32 (sin.f32 (*.f32 (*.f32 x (PI.f32)) tau)) (*.f32 (*.f32 x (PI.f32)) tau)) (/.f32 (sin.f32 (*.f32 x (PI.f32))) (*.f32 x (PI.f32)))) Initial program 97.9%
remove-double-negN/A
lift-sin.f32N/A
sin-+PI-revN/A
cos-+PI/2-revN/A
lower-cos.f32N/A
+-commutativeN/A
lift-PI.f32N/A
associate-+l+N/A
+-commutativeN/A
lift-PI.f32N/A
+-commutativeN/A
lift-PI.f32N/A
mult-flipN/A
metadata-evalN/A
lift-*.f32N/A
*-commutativeN/A
distribute-lft-outN/A
lift-PI.f32N/A
lower-fma.f32N/A
Applied rewrites76.7%
Taylor expanded in x around 0
Applied rewrites52.3%
lift-cos.f32N/A
lift-fma.f32N/A
cos-sumN/A
sub-negate-revN/A
sub-negateN/A
cos-sumN/A
lift-fma.f32N/A
lift-cos.f32N/A
lift-cos.f32N/A
cos-+PI-revN/A
cos-neg-revN/A
Applied rewrites51.1%
Applied rewrites64.3%
(FPCore (x tau) :precision binary32 (/ 1.0 (/ (* PI x) (* (sin (* PI x)) 1.0))))
float code(float x, float tau) {
return 1.0f / ((((float) M_PI) * x) / (sinf((((float) M_PI) * x)) * 1.0f));
}
function code(x, tau) return Float32(Float32(1.0) / Float32(Float32(Float32(pi) * x) / Float32(sin(Float32(Float32(pi) * x)) * Float32(1.0)))) end
function tmp = code(x, tau) tmp = single(1.0) / ((single(pi) * x) / (sin((single(pi) * x)) * single(1.0))); end
\frac{1}{\frac{\pi \cdot x}{\sin \left(\pi \cdot x\right) \cdot 1}}
Initial program 97.9%
remove-double-negN/A
lift-sin.f32N/A
sin-+PI-revN/A
cos-+PI/2-revN/A
lower-cos.f32N/A
+-commutativeN/A
lift-PI.f32N/A
associate-+l+N/A
+-commutativeN/A
lift-PI.f32N/A
+-commutativeN/A
lift-PI.f32N/A
mult-flipN/A
metadata-evalN/A
lift-*.f32N/A
*-commutativeN/A
distribute-lft-outN/A
lift-PI.f32N/A
lower-fma.f32N/A
Applied rewrites76.7%
Taylor expanded in x around 0
Applied rewrites52.3%
lift-cos.f32N/A
lift-fma.f32N/A
cos-sumN/A
sub-negate-revN/A
sub-negateN/A
cos-sumN/A
lift-fma.f32N/A
lift-cos.f32N/A
lift-cos.f32N/A
cos-+PI-revN/A
cos-neg-revN/A
Applied rewrites51.1%
Applied rewrites64.3%
(FPCore (x tau) :precision binary32 (* 1.0 (/ (sin (* x PI)) (* x PI))))
float code(float x, float tau) {
return 1.0f * (sinf((x * ((float) M_PI))) / (x * ((float) M_PI)));
}
function code(x, tau) return Float32(Float32(1.0) * Float32(sin(Float32(x * Float32(pi))) / Float32(x * Float32(pi)))) end
function tmp = code(x, tau) tmp = single(1.0) * (sin((x * single(pi))) / (x * single(pi))); end
1 \cdot \frac{\sin \left(x \cdot \pi\right)}{x \cdot \pi}
Initial program 97.9%
Taylor expanded in x around 0
Applied rewrites64.3%
(FPCore (x tau) :precision binary32 (* 1.0 (/ (cos 4.71238899230957) (* x PI))))
float code(float x, float tau) {
return 1.0f * (cosf(4.71238899230957f) / (x * ((float) M_PI)));
}
function code(x, tau) return Float32(Float32(1.0) * Float32(cos(Float32(4.71238899230957)) / Float32(x * Float32(pi)))) end
function tmp = code(x, tau) tmp = single(1.0) * (cos(single(4.71238899230957)) / (x * single(pi))); end
1 \cdot \frac{\cos 4.71238899230957}{x \cdot \pi}
Initial program 97.9%
remove-double-negN/A
lift-sin.f32N/A
sin-+PI-revN/A
cos-+PI/2-revN/A
lower-cos.f32N/A
+-commutativeN/A
lift-PI.f32N/A
associate-+l+N/A
+-commutativeN/A
lift-PI.f32N/A
+-commutativeN/A
lift-PI.f32N/A
mult-flipN/A
metadata-evalN/A
lift-*.f32N/A
*-commutativeN/A
distribute-lft-outN/A
lift-PI.f32N/A
lower-fma.f32N/A
Applied rewrites76.7%
Taylor expanded in x around 0
Applied rewrites52.3%
Taylor expanded in x around 0
lower-+.f32N/A
lower-PI.f32N/A
lower-*.f32N/A
lower-PI.f3214.4%
Applied rewrites14.4%
Evaluated real constant14.4%
herbie shell --seed 2025322
(FPCore (x tau)
:name "Lanczos kernel"
:precision binary32
:pre (and (and (<= 1e-5 x) (<= x 1.0)) (and (<= 1.0 tau) (<= tau 5.0)))
(* (/ (sin (* (* x PI) tau)) (* (* x PI) tau)) (/ (sin (* x PI)) (* x PI))))