
(FPCore (s r) :precision binary32 (+ (/ (* 0.25 (exp (/ (- r) s))) (* (* (* 2.0 PI) s) r)) (/ (* 0.75 (exp (/ (- r) (* 3.0 s)))) (* (* (* 6.0 PI) s) r))))
float code(float s, float r) {
return ((0.25f * expf((-r / s))) / (((2.0f * ((float) M_PI)) * s) * r)) + ((0.75f * expf((-r / (3.0f * s)))) / (((6.0f * ((float) M_PI)) * s) * r));
}
function code(s, r) return Float32(Float32(Float32(Float32(0.25) * exp(Float32(Float32(-r) / s))) / Float32(Float32(Float32(Float32(2.0) * Float32(pi)) * s) * r)) + Float32(Float32(Float32(0.75) * exp(Float32(Float32(-r) / Float32(Float32(3.0) * s)))) / Float32(Float32(Float32(Float32(6.0) * Float32(pi)) * s) * r))) end
function tmp = code(s, r) tmp = ((single(0.25) * exp((-r / s))) / (((single(2.0) * single(pi)) * s) * r)) + ((single(0.75) * exp((-r / (single(3.0) * s)))) / (((single(6.0) * single(pi)) * s) * r)); end
\begin{array}{l}
\\
\frac{0.25 \cdot e^{\frac{-r}{s}}}{\left(\left(2 \cdot \pi\right) \cdot s\right) \cdot r} + \frac{0.75 \cdot e^{\frac{-r}{3 \cdot s}}}{\left(\left(6 \cdot \pi\right) \cdot s\right) \cdot r}
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 14 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (s r) :precision binary32 (+ (/ (* 0.25 (exp (/ (- r) s))) (* (* (* 2.0 PI) s) r)) (/ (* 0.75 (exp (/ (- r) (* 3.0 s)))) (* (* (* 6.0 PI) s) r))))
float code(float s, float r) {
return ((0.25f * expf((-r / s))) / (((2.0f * ((float) M_PI)) * s) * r)) + ((0.75f * expf((-r / (3.0f * s)))) / (((6.0f * ((float) M_PI)) * s) * r));
}
function code(s, r) return Float32(Float32(Float32(Float32(0.25) * exp(Float32(Float32(-r) / s))) / Float32(Float32(Float32(Float32(2.0) * Float32(pi)) * s) * r)) + Float32(Float32(Float32(0.75) * exp(Float32(Float32(-r) / Float32(Float32(3.0) * s)))) / Float32(Float32(Float32(Float32(6.0) * Float32(pi)) * s) * r))) end
function tmp = code(s, r) tmp = ((single(0.25) * exp((-r / s))) / (((single(2.0) * single(pi)) * s) * r)) + ((single(0.75) * exp((-r / (single(3.0) * s)))) / (((single(6.0) * single(pi)) * s) * r)); end
\begin{array}{l}
\\
\frac{0.25 \cdot e^{\frac{-r}{s}}}{\left(\left(2 \cdot \pi\right) \cdot s\right) \cdot r} + \frac{0.75 \cdot e^{\frac{-r}{3 \cdot s}}}{\left(\left(6 \cdot \pi\right) \cdot s\right) \cdot r}
\end{array}
(FPCore (s r) :precision binary32 (/ (/ (/ (* 0.125 (+ (exp (/ r (- s))) (exp (/ (/ r s) -3.0)))) s) r) PI))
float code(float s, float r) {
return (((0.125f * (expf((r / -s)) + expf(((r / s) / -3.0f)))) / s) / r) / ((float) M_PI);
}
function code(s, r) return Float32(Float32(Float32(Float32(Float32(0.125) * Float32(exp(Float32(r / Float32(-s))) + exp(Float32(Float32(r / s) / Float32(-3.0))))) / s) / r) / Float32(pi)) end
function tmp = code(s, r) tmp = (((single(0.125) * (exp((r / -s)) + exp(((r / s) / single(-3.0))))) / s) / r) / single(pi); end
\begin{array}{l}
\\
\frac{\frac{\frac{0.125 \cdot \left(e^{\frac{r}{-s}} + e^{\frac{\frac{r}{s}}{-3}}\right)}{s}}{r}}{\pi}
\end{array}
Initial program 99.6%
Simplified97.3%
associate-*l/N/A
*-commutativeN/A
associate-/r*N/A
/-lowering-/.f32N/A
Applied egg-rr99.6%
associate-/r*N/A
/-lowering-/.f32N/A
/-lowering-/.f3299.7%
Applied egg-rr99.7%
Final simplification99.7%
(FPCore (s r) :precision binary32 (/ (/ (/ (* 0.125 (+ (exp (/ r (- s))) (exp (/ (/ r -3.0) s)))) s) r) PI))
float code(float s, float r) {
return (((0.125f * (expf((r / -s)) + expf(((r / -3.0f) / s)))) / s) / r) / ((float) M_PI);
}
function code(s, r) return Float32(Float32(Float32(Float32(Float32(0.125) * Float32(exp(Float32(r / Float32(-s))) + exp(Float32(Float32(r / Float32(-3.0)) / s)))) / s) / r) / Float32(pi)) end
function tmp = code(s, r) tmp = (((single(0.125) * (exp((r / -s)) + exp(((r / single(-3.0)) / s)))) / s) / r) / single(pi); end
\begin{array}{l}
\\
\frac{\frac{\frac{0.125 \cdot \left(e^{\frac{r}{-s}} + e^{\frac{\frac{r}{-3}}{s}}\right)}{s}}{r}}{\pi}
\end{array}
Initial program 99.6%
Simplified97.3%
associate-*l/N/A
*-commutativeN/A
associate-/r*N/A
/-lowering-/.f32N/A
Applied egg-rr99.6%
*-commutativeN/A
associate-/r*N/A
remove-double-negN/A
metadata-evalN/A
frac-2negN/A
/-lowering-/.f32N/A
frac-2negN/A
remove-double-negN/A
metadata-evalN/A
/-lowering-/.f3299.6%
Applied egg-rr99.6%
Final simplification99.6%
(FPCore (s r) :precision binary32 (/ (* (/ 0.125 s) (/ (+ (exp (/ r (- s))) (exp (/ r (* s -3.0)))) r)) PI))
float code(float s, float r) {
return ((0.125f / s) * ((expf((r / -s)) + expf((r / (s * -3.0f)))) / r)) / ((float) M_PI);
}
function code(s, r) return Float32(Float32(Float32(Float32(0.125) / s) * Float32(Float32(exp(Float32(r / Float32(-s))) + exp(Float32(r / Float32(s * Float32(-3.0))))) / r)) / Float32(pi)) end
function tmp = code(s, r) tmp = ((single(0.125) / s) * ((exp((r / -s)) + exp((r / (s * single(-3.0))))) / r)) / single(pi); end
\begin{array}{l}
\\
\frac{\frac{0.125}{s} \cdot \frac{e^{\frac{r}{-s}} + e^{\frac{r}{s \cdot -3}}}{r}}{\pi}
\end{array}
Initial program 99.6%
Simplified97.3%
associate-*l/N/A
*-commutativeN/A
times-fracN/A
*-lowering-*.f32N/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
Applied egg-rr99.6%
Final simplification99.6%
(FPCore (s r) :precision binary32 (/ (* 0.125 (+ (exp (/ r (- s))) (exp (/ r (* s -3.0))))) (* PI (* r s))))
float code(float s, float r) {
return (0.125f * (expf((r / -s)) + expf((r / (s * -3.0f))))) / (((float) M_PI) * (r * s));
}
function code(s, r) return Float32(Float32(Float32(0.125) * Float32(exp(Float32(r / Float32(-s))) + exp(Float32(r / Float32(s * Float32(-3.0)))))) / Float32(Float32(pi) * Float32(r * s))) end
function tmp = code(s, r) tmp = (single(0.125) * (exp((r / -s)) + exp((r / (s * single(-3.0)))))) / (single(pi) * (r * s)); end
\begin{array}{l}
\\
\frac{0.125 \cdot \left(e^{\frac{r}{-s}} + e^{\frac{r}{s \cdot -3}}\right)}{\pi \cdot \left(r \cdot s\right)}
\end{array}
Initial program 99.6%
Simplified97.3%
associate-/l*N/A
frac-timesN/A
/-lowering-/.f32N/A
Applied egg-rr99.6%
Final simplification99.6%
(FPCore (s r)
:precision binary32
(let* ((t_0
(+
(* (* r PI) (* (* (* r r) 1.7777777777777777) -0.125))
(* (* (* r r) (* PI 0.5555555555555556)) (* r 0.25)))))
(/
1.0
(*
s
(+
(+
(/ (* -2.0 (* r (* PI (* r -1.3333333333333333)))) s)
(* (* r PI) 4.0))
(*
-8.0
(+
(/
(+
(* t_0 (* (* r -1.3333333333333333) -0.5))
(+
(*
(* (* r PI) -0.125)
(* (* r r) (* (* r -1.3333333333333333) 0.5555555555555556)))
(* PI (* -0.041666666666666664 (pow r 4.0)))))
(* s (* s s)))
(/ t_0 (* s s)))))))))
float code(float s, float r) {
float t_0 = ((r * ((float) M_PI)) * (((r * r) * 1.7777777777777777f) * -0.125f)) + (((r * r) * (((float) M_PI) * 0.5555555555555556f)) * (r * 0.25f));
return 1.0f / (s * ((((-2.0f * (r * (((float) M_PI) * (r * -1.3333333333333333f)))) / s) + ((r * ((float) M_PI)) * 4.0f)) + (-8.0f * ((((t_0 * ((r * -1.3333333333333333f) * -0.5f)) + ((((r * ((float) M_PI)) * -0.125f) * ((r * r) * ((r * -1.3333333333333333f) * 0.5555555555555556f))) + (((float) M_PI) * (-0.041666666666666664f * powf(r, 4.0f))))) / (s * (s * s))) + (t_0 / (s * s))))));
}
function code(s, r) t_0 = Float32(Float32(Float32(r * Float32(pi)) * Float32(Float32(Float32(r * r) * Float32(1.7777777777777777)) * Float32(-0.125))) + Float32(Float32(Float32(r * r) * Float32(Float32(pi) * Float32(0.5555555555555556))) * Float32(r * Float32(0.25)))) return Float32(Float32(1.0) / Float32(s * Float32(Float32(Float32(Float32(Float32(-2.0) * Float32(r * Float32(Float32(pi) * Float32(r * Float32(-1.3333333333333333))))) / s) + Float32(Float32(r * Float32(pi)) * Float32(4.0))) + Float32(Float32(-8.0) * Float32(Float32(Float32(Float32(t_0 * Float32(Float32(r * Float32(-1.3333333333333333)) * Float32(-0.5))) + Float32(Float32(Float32(Float32(r * Float32(pi)) * Float32(-0.125)) * Float32(Float32(r * r) * Float32(Float32(r * Float32(-1.3333333333333333)) * Float32(0.5555555555555556)))) + Float32(Float32(pi) * Float32(Float32(-0.041666666666666664) * (r ^ Float32(4.0)))))) / Float32(s * Float32(s * s))) + Float32(t_0 / Float32(s * s))))))) end
function tmp = code(s, r) t_0 = ((r * single(pi)) * (((r * r) * single(1.7777777777777777)) * single(-0.125))) + (((r * r) * (single(pi) * single(0.5555555555555556))) * (r * single(0.25))); tmp = single(1.0) / (s * ((((single(-2.0) * (r * (single(pi) * (r * single(-1.3333333333333333))))) / s) + ((r * single(pi)) * single(4.0))) + (single(-8.0) * ((((t_0 * ((r * single(-1.3333333333333333)) * single(-0.5))) + ((((r * single(pi)) * single(-0.125)) * ((r * r) * ((r * single(-1.3333333333333333)) * single(0.5555555555555556)))) + (single(pi) * (single(-0.041666666666666664) * (r ^ single(4.0)))))) / (s * (s * s))) + (t_0 / (s * s)))))); end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(r \cdot \pi\right) \cdot \left(\left(\left(r \cdot r\right) \cdot 1.7777777777777777\right) \cdot -0.125\right) + \left(\left(r \cdot r\right) \cdot \left(\pi \cdot 0.5555555555555556\right)\right) \cdot \left(r \cdot 0.25\right)\\
\frac{1}{s \cdot \left(\left(\frac{-2 \cdot \left(r \cdot \left(\pi \cdot \left(r \cdot -1.3333333333333333\right)\right)\right)}{s} + \left(r \cdot \pi\right) \cdot 4\right) + -8 \cdot \left(\frac{t\_0 \cdot \left(\left(r \cdot -1.3333333333333333\right) \cdot -0.5\right) + \left(\left(\left(r \cdot \pi\right) \cdot -0.125\right) \cdot \left(\left(r \cdot r\right) \cdot \left(\left(r \cdot -1.3333333333333333\right) \cdot 0.5555555555555556\right)\right) + \pi \cdot \left(-0.041666666666666664 \cdot {r}^{4}\right)\right)}{s \cdot \left(s \cdot s\right)} + \frac{t\_0}{s \cdot s}\right)\right)}
\end{array}
\end{array}
Initial program 99.6%
Simplified97.3%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f328.8%
Simplified8.8%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr8.8%
Taylor expanded in s around inf
Simplified70.3%
Final simplification70.3%
(FPCore (s r)
:precision binary32
(let* ((t_0 (* (* r 1.3333333333333333) (* r 1.3333333333333333))))
(/
1.0
(*
s
(-
(/
(+
(* (* r PI) (* (* r 1.3333333333333333) 2.0))
(/
(-
(-
(* r (* PI t_0))
(* 2.0 (* (* r PI) (* r (* r 0.5555555555555556)))))
(/
(*
-8.0
(+
(*
(* r 1.3333333333333333)
(*
-0.5
(+
(* (* (* r r) (* PI 0.5555555555555556)) (* r 0.25))
(* (* r PI) (* -0.125 t_0)))))
(+
(*
-0.125
(*
(* r PI)
(* (* r r) (* 0.5555555555555556 (* r 1.3333333333333333)))))
(* PI (* (pow r 4.0) 0.041666666666666664)))))
s))
s))
s)
(* (* r PI) -4.0))))))
float code(float s, float r) {
float t_0 = (r * 1.3333333333333333f) * (r * 1.3333333333333333f);
return 1.0f / (s * (((((r * ((float) M_PI)) * ((r * 1.3333333333333333f) * 2.0f)) + ((((r * (((float) M_PI) * t_0)) - (2.0f * ((r * ((float) M_PI)) * (r * (r * 0.5555555555555556f))))) - ((-8.0f * (((r * 1.3333333333333333f) * (-0.5f * ((((r * r) * (((float) M_PI) * 0.5555555555555556f)) * (r * 0.25f)) + ((r * ((float) M_PI)) * (-0.125f * t_0))))) + ((-0.125f * ((r * ((float) M_PI)) * ((r * r) * (0.5555555555555556f * (r * 1.3333333333333333f))))) + (((float) M_PI) * (powf(r, 4.0f) * 0.041666666666666664f))))) / s)) / s)) / s) - ((r * ((float) M_PI)) * -4.0f)));
}
function code(s, r) t_0 = Float32(Float32(r * Float32(1.3333333333333333)) * Float32(r * Float32(1.3333333333333333))) return Float32(Float32(1.0) / Float32(s * Float32(Float32(Float32(Float32(Float32(r * Float32(pi)) * Float32(Float32(r * Float32(1.3333333333333333)) * Float32(2.0))) + Float32(Float32(Float32(Float32(r * Float32(Float32(pi) * t_0)) - Float32(Float32(2.0) * Float32(Float32(r * Float32(pi)) * Float32(r * Float32(r * Float32(0.5555555555555556)))))) - Float32(Float32(Float32(-8.0) * Float32(Float32(Float32(r * Float32(1.3333333333333333)) * Float32(Float32(-0.5) * Float32(Float32(Float32(Float32(r * r) * Float32(Float32(pi) * Float32(0.5555555555555556))) * Float32(r * Float32(0.25))) + Float32(Float32(r * Float32(pi)) * Float32(Float32(-0.125) * t_0))))) + Float32(Float32(Float32(-0.125) * Float32(Float32(r * Float32(pi)) * Float32(Float32(r * r) * Float32(Float32(0.5555555555555556) * Float32(r * Float32(1.3333333333333333)))))) + Float32(Float32(pi) * Float32((r ^ Float32(4.0)) * Float32(0.041666666666666664)))))) / s)) / s)) / s) - Float32(Float32(r * Float32(pi)) * Float32(-4.0))))) end
function tmp = code(s, r) t_0 = (r * single(1.3333333333333333)) * (r * single(1.3333333333333333)); tmp = single(1.0) / (s * (((((r * single(pi)) * ((r * single(1.3333333333333333)) * single(2.0))) + ((((r * (single(pi) * t_0)) - (single(2.0) * ((r * single(pi)) * (r * (r * single(0.5555555555555556)))))) - ((single(-8.0) * (((r * single(1.3333333333333333)) * (single(-0.5) * ((((r * r) * (single(pi) * single(0.5555555555555556))) * (r * single(0.25))) + ((r * single(pi)) * (single(-0.125) * t_0))))) + ((single(-0.125) * ((r * single(pi)) * ((r * r) * (single(0.5555555555555556) * (r * single(1.3333333333333333)))))) + (single(pi) * ((r ^ single(4.0)) * single(0.041666666666666664)))))) / s)) / s)) / s) - ((r * single(pi)) * single(-4.0)))); end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(r \cdot 1.3333333333333333\right) \cdot \left(r \cdot 1.3333333333333333\right)\\
\frac{1}{s \cdot \left(\frac{\left(r \cdot \pi\right) \cdot \left(\left(r \cdot 1.3333333333333333\right) \cdot 2\right) + \frac{\left(r \cdot \left(\pi \cdot t\_0\right) - 2 \cdot \left(\left(r \cdot \pi\right) \cdot \left(r \cdot \left(r \cdot 0.5555555555555556\right)\right)\right)\right) - \frac{-8 \cdot \left(\left(r \cdot 1.3333333333333333\right) \cdot \left(-0.5 \cdot \left(\left(\left(r \cdot r\right) \cdot \left(\pi \cdot 0.5555555555555556\right)\right) \cdot \left(r \cdot 0.25\right) + \left(r \cdot \pi\right) \cdot \left(-0.125 \cdot t\_0\right)\right)\right) + \left(-0.125 \cdot \left(\left(r \cdot \pi\right) \cdot \left(\left(r \cdot r\right) \cdot \left(0.5555555555555556 \cdot \left(r \cdot 1.3333333333333333\right)\right)\right)\right) + \pi \cdot \left({r}^{4} \cdot 0.041666666666666664\right)\right)\right)}{s}}{s}}{s} - \left(r \cdot \pi\right) \cdot -4\right)}
\end{array}
\end{array}
Initial program 99.6%
Simplified97.3%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f328.8%
Simplified8.8%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr8.8%
Taylor expanded in s around -inf
Simplified66.4%
Final simplification66.4%
(FPCore (s r)
:precision binary32
(if (<= s 1.999999936531045e-20)
(/
1.0
(*
s
(+
(+
(/ (* -2.0 (* r (* PI (* r -1.3333333333333333)))) s)
(* (* r PI) 4.0))
(/
(*
-8.0
(+
(* (* r PI) (* (* (* r r) 1.7777777777777777) -0.125))
(* (* (* r r) (* PI 0.5555555555555556)) (* r 0.25))))
(* s s)))))
(/
1.0
(*
r
(+
(* PI (+ (* r 2.6666666666666665) (* s 4.0)))
(*
r
(*
r
(+
(*
(+
(/ (* (/ (* PI -0.08333333333333333) s) 0.6666666666666666) s)
(* (/ PI (* s s)) 0.05092592592592592))
(* r -8.0))
(* 0.6666666666666666 (/ PI s))))))))))
float code(float s, float r) {
float tmp;
if (s <= 1.999999936531045e-20f) {
tmp = 1.0f / (s * ((((-2.0f * (r * (((float) M_PI) * (r * -1.3333333333333333f)))) / s) + ((r * ((float) M_PI)) * 4.0f)) + ((-8.0f * (((r * ((float) M_PI)) * (((r * r) * 1.7777777777777777f) * -0.125f)) + (((r * r) * (((float) M_PI) * 0.5555555555555556f)) * (r * 0.25f)))) / (s * s))));
} else {
tmp = 1.0f / (r * ((((float) M_PI) * ((r * 2.6666666666666665f) + (s * 4.0f))) + (r * (r * (((((((((float) M_PI) * -0.08333333333333333f) / s) * 0.6666666666666666f) / s) + ((((float) M_PI) / (s * s)) * 0.05092592592592592f)) * (r * -8.0f)) + (0.6666666666666666f * (((float) M_PI) / s)))))));
}
return tmp;
}
function code(s, r) tmp = Float32(0.0) if (s <= Float32(1.999999936531045e-20)) tmp = Float32(Float32(1.0) / Float32(s * Float32(Float32(Float32(Float32(Float32(-2.0) * Float32(r * Float32(Float32(pi) * Float32(r * Float32(-1.3333333333333333))))) / s) + Float32(Float32(r * Float32(pi)) * Float32(4.0))) + Float32(Float32(Float32(-8.0) * Float32(Float32(Float32(r * Float32(pi)) * Float32(Float32(Float32(r * r) * Float32(1.7777777777777777)) * Float32(-0.125))) + Float32(Float32(Float32(r * r) * Float32(Float32(pi) * Float32(0.5555555555555556))) * Float32(r * Float32(0.25))))) / Float32(s * s))))); else tmp = Float32(Float32(1.0) / Float32(r * Float32(Float32(Float32(pi) * Float32(Float32(r * Float32(2.6666666666666665)) + Float32(s * Float32(4.0)))) + Float32(r * Float32(r * Float32(Float32(Float32(Float32(Float32(Float32(Float32(Float32(pi) * Float32(-0.08333333333333333)) / s) * Float32(0.6666666666666666)) / s) + Float32(Float32(Float32(pi) / Float32(s * s)) * Float32(0.05092592592592592))) * Float32(r * Float32(-8.0))) + Float32(Float32(0.6666666666666666) * Float32(Float32(pi) / s)))))))); end return tmp end
function tmp_2 = code(s, r) tmp = single(0.0); if (s <= single(1.999999936531045e-20)) tmp = single(1.0) / (s * ((((single(-2.0) * (r * (single(pi) * (r * single(-1.3333333333333333))))) / s) + ((r * single(pi)) * single(4.0))) + ((single(-8.0) * (((r * single(pi)) * (((r * r) * single(1.7777777777777777)) * single(-0.125))) + (((r * r) * (single(pi) * single(0.5555555555555556))) * (r * single(0.25))))) / (s * s)))); else tmp = single(1.0) / (r * ((single(pi) * ((r * single(2.6666666666666665)) + (s * single(4.0)))) + (r * (r * (((((((single(pi) * single(-0.08333333333333333)) / s) * single(0.6666666666666666)) / s) + ((single(pi) / (s * s)) * single(0.05092592592592592))) * (r * single(-8.0))) + (single(0.6666666666666666) * (single(pi) / s))))))); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;s \leq 1.999999936531045 \cdot 10^{-20}:\\
\;\;\;\;\frac{1}{s \cdot \left(\left(\frac{-2 \cdot \left(r \cdot \left(\pi \cdot \left(r \cdot -1.3333333333333333\right)\right)\right)}{s} + \left(r \cdot \pi\right) \cdot 4\right) + \frac{-8 \cdot \left(\left(r \cdot \pi\right) \cdot \left(\left(\left(r \cdot r\right) \cdot 1.7777777777777777\right) \cdot -0.125\right) + \left(\left(r \cdot r\right) \cdot \left(\pi \cdot 0.5555555555555556\right)\right) \cdot \left(r \cdot 0.25\right)\right)}{s \cdot s}\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{r \cdot \left(\pi \cdot \left(r \cdot 2.6666666666666665 + s \cdot 4\right) + r \cdot \left(r \cdot \left(\left(\frac{\frac{\pi \cdot -0.08333333333333333}{s} \cdot 0.6666666666666666}{s} + \frac{\pi}{s \cdot s} \cdot 0.05092592592592592\right) \cdot \left(r \cdot -8\right) + 0.6666666666666666 \cdot \frac{\pi}{s}\right)\right)\right)}\\
\end{array}
\end{array}
if s < 1.99999994e-20Initial program 100.0%
Simplified94.5%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f323.1%
Simplified3.1%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr3.1%
Taylor expanded in s around inf
Simplified94.1%
if 1.99999994e-20 < s Initial program 99.3%
Simplified99.4%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f3213.0%
Simplified13.0%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr13.0%
Taylor expanded in r around 0
Simplified32.5%
Final simplification58.7%
(FPCore (s r)
:precision binary32
(let* ((t_0 (* 0.6666666666666666 (/ PI s))))
(if (<= s 1.999999936531045e-20)
(/
1.0
(* r (+ (* 4.0 (* s PI)) (* r (+ (* PI 2.6666666666666665) (* r t_0))))))
(/
1.0
(*
r
(+
(* PI (+ (* r 2.6666666666666665) (* s 4.0)))
(*
r
(*
r
(+
(*
(+
(/ (* (/ (* PI -0.08333333333333333) s) 0.6666666666666666) s)
(* (/ PI (* s s)) 0.05092592592592592))
(* r -8.0))
t_0)))))))))
float code(float s, float r) {
float t_0 = 0.6666666666666666f * (((float) M_PI) / s);
float tmp;
if (s <= 1.999999936531045e-20f) {
tmp = 1.0f / (r * ((4.0f * (s * ((float) M_PI))) + (r * ((((float) M_PI) * 2.6666666666666665f) + (r * t_0)))));
} else {
tmp = 1.0f / (r * ((((float) M_PI) * ((r * 2.6666666666666665f) + (s * 4.0f))) + (r * (r * (((((((((float) M_PI) * -0.08333333333333333f) / s) * 0.6666666666666666f) / s) + ((((float) M_PI) / (s * s)) * 0.05092592592592592f)) * (r * -8.0f)) + t_0)))));
}
return tmp;
}
function code(s, r) t_0 = Float32(Float32(0.6666666666666666) * Float32(Float32(pi) / s)) tmp = Float32(0.0) if (s <= Float32(1.999999936531045e-20)) tmp = Float32(Float32(1.0) / Float32(r * Float32(Float32(Float32(4.0) * Float32(s * Float32(pi))) + Float32(r * Float32(Float32(Float32(pi) * Float32(2.6666666666666665)) + Float32(r * t_0)))))); else tmp = Float32(Float32(1.0) / Float32(r * Float32(Float32(Float32(pi) * Float32(Float32(r * Float32(2.6666666666666665)) + Float32(s * Float32(4.0)))) + Float32(r * Float32(r * Float32(Float32(Float32(Float32(Float32(Float32(Float32(Float32(pi) * Float32(-0.08333333333333333)) / s) * Float32(0.6666666666666666)) / s) + Float32(Float32(Float32(pi) / Float32(s * s)) * Float32(0.05092592592592592))) * Float32(r * Float32(-8.0))) + t_0)))))); end return tmp end
function tmp_2 = code(s, r) t_0 = single(0.6666666666666666) * (single(pi) / s); tmp = single(0.0); if (s <= single(1.999999936531045e-20)) tmp = single(1.0) / (r * ((single(4.0) * (s * single(pi))) + (r * ((single(pi) * single(2.6666666666666665)) + (r * t_0))))); else tmp = single(1.0) / (r * ((single(pi) * ((r * single(2.6666666666666665)) + (s * single(4.0)))) + (r * (r * (((((((single(pi) * single(-0.08333333333333333)) / s) * single(0.6666666666666666)) / s) + ((single(pi) / (s * s)) * single(0.05092592592592592))) * (r * single(-8.0))) + t_0))))); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 0.6666666666666666 \cdot \frac{\pi}{s}\\
\mathbf{if}\;s \leq 1.999999936531045 \cdot 10^{-20}:\\
\;\;\;\;\frac{1}{r \cdot \left(4 \cdot \left(s \cdot \pi\right) + r \cdot \left(\pi \cdot 2.6666666666666665 + r \cdot t\_0\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{r \cdot \left(\pi \cdot \left(r \cdot 2.6666666666666665 + s \cdot 4\right) + r \cdot \left(r \cdot \left(\left(\frac{\frac{\pi \cdot -0.08333333333333333}{s} \cdot 0.6666666666666666}{s} + \frac{\pi}{s \cdot s} \cdot 0.05092592592592592\right) \cdot \left(r \cdot -8\right) + t\_0\right)\right)\right)}\\
\end{array}
\end{array}
if s < 1.99999994e-20Initial program 100.0%
Simplified94.5%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f323.1%
Simplified3.1%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr3.1%
Taylor expanded in r around 0
*-lowering-*.f32N/A
+-lowering-+.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f32N/A
*-lowering-*.f32N/A
+-commutativeN/A
*-commutativeN/A
associate-*r*N/A
Simplified37.0%
if 1.99999994e-20 < s Initial program 99.3%
Simplified99.4%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f3213.0%
Simplified13.0%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr13.0%
Taylor expanded in r around 0
Simplified32.5%
Final simplification34.4%
(FPCore (s r)
:precision binary32
(/
1.0
(*
r
(+
(* 4.0 (* s PI))
(*
r
(+ (* PI 2.6666666666666665) (* r (* 0.6666666666666666 (/ PI s)))))))))
float code(float s, float r) {
return 1.0f / (r * ((4.0f * (s * ((float) M_PI))) + (r * ((((float) M_PI) * 2.6666666666666665f) + (r * (0.6666666666666666f * (((float) M_PI) / s)))))));
}
function code(s, r) return Float32(Float32(1.0) / Float32(r * Float32(Float32(Float32(4.0) * Float32(s * Float32(pi))) + Float32(r * Float32(Float32(Float32(pi) * Float32(2.6666666666666665)) + Float32(r * Float32(Float32(0.6666666666666666) * Float32(Float32(pi) / s)))))))) end
function tmp = code(s, r) tmp = single(1.0) / (r * ((single(4.0) * (s * single(pi))) + (r * ((single(pi) * single(2.6666666666666665)) + (r * (single(0.6666666666666666) * (single(pi) / s))))))); end
\begin{array}{l}
\\
\frac{1}{r \cdot \left(4 \cdot \left(s \cdot \pi\right) + r \cdot \left(\pi \cdot 2.6666666666666665 + r \cdot \left(0.6666666666666666 \cdot \frac{\pi}{s}\right)\right)\right)}
\end{array}
Initial program 99.6%
Simplified97.3%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f328.8%
Simplified8.8%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr8.8%
Taylor expanded in r around 0
*-lowering-*.f32N/A
+-lowering-+.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f32N/A
*-lowering-*.f32N/A
+-commutativeN/A
*-commutativeN/A
associate-*r*N/A
Simplified25.5%
Final simplification25.5%
(FPCore (s r)
:precision binary32
(/
1.0
(*
s
(+
(/ (* -2.0 (* r (* PI (* r -1.3333333333333333)))) s)
(* (* r PI) 4.0)))))
float code(float s, float r) {
return 1.0f / (s * (((-2.0f * (r * (((float) M_PI) * (r * -1.3333333333333333f)))) / s) + ((r * ((float) M_PI)) * 4.0f)));
}
function code(s, r) return Float32(Float32(1.0) / Float32(s * Float32(Float32(Float32(Float32(-2.0) * Float32(r * Float32(Float32(pi) * Float32(r * Float32(-1.3333333333333333))))) / s) + Float32(Float32(r * Float32(pi)) * Float32(4.0))))) end
function tmp = code(s, r) tmp = single(1.0) / (s * (((single(-2.0) * (r * (single(pi) * (r * single(-1.3333333333333333))))) / s) + ((r * single(pi)) * single(4.0)))); end
\begin{array}{l}
\\
\frac{1}{s \cdot \left(\frac{-2 \cdot \left(r \cdot \left(\pi \cdot \left(r \cdot -1.3333333333333333\right)\right)\right)}{s} + \left(r \cdot \pi\right) \cdot 4\right)}
\end{array}
Initial program 99.6%
Simplified97.3%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f328.8%
Simplified8.8%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr8.8%
Taylor expanded in s around inf
*-lowering-*.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f32N/A
distribute-rgt-out--N/A
metadata-evalN/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
Simplified18.8%
(FPCore (s r) :precision binary32 (/ 1.0 (* r (* PI (+ (* r 2.6666666666666665) (* s 4.0))))))
float code(float s, float r) {
return 1.0f / (r * (((float) M_PI) * ((r * 2.6666666666666665f) + (s * 4.0f))));
}
function code(s, r) return Float32(Float32(1.0) / Float32(r * Float32(Float32(pi) * Float32(Float32(r * Float32(2.6666666666666665)) + Float32(s * Float32(4.0)))))) end
function tmp = code(s, r) tmp = single(1.0) / (r * (single(pi) * ((r * single(2.6666666666666665)) + (s * single(4.0))))); end
\begin{array}{l}
\\
\frac{1}{r \cdot \left(\pi \cdot \left(r \cdot 2.6666666666666665 + s \cdot 4\right)\right)}
\end{array}
Initial program 99.6%
Simplified97.3%
Taylor expanded in s around -inf
mul-1-negN/A
unsub-negN/A
--lowering--.f32N/A
/-lowering-/.f32N/A
+-lowering-+.f32N/A
associate-*r/N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
unpow2N/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f328.8%
Simplified8.8%
clear-numN/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
PI-lowering-PI.f32N/A
*-commutativeN/A
clear-numN/A
un-div-invN/A
/-lowering-/.f32N/A
Applied egg-rr8.8%
Taylor expanded in r around 0
*-commutativeN/A
associate-*r*N/A
*-lowering-*.f32N/A
associate-*r*N/A
*-commutativeN/A
associate-*r*N/A
associate-*r*N/A
distribute-rgt-outN/A
*-lowering-*.f32N/A
PI-lowering-PI.f32N/A
+-lowering-+.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
*-commutativeN/A
*-lowering-*.f3210.8%
Simplified10.8%
(FPCore (s r) :precision binary32 (* (/ 1.0 s) (/ 0.25 (* r PI))))
float code(float s, float r) {
return (1.0f / s) * (0.25f / (r * ((float) M_PI)));
}
function code(s, r) return Float32(Float32(Float32(1.0) / s) * Float32(Float32(0.25) / Float32(r * Float32(pi)))) end
function tmp = code(s, r) tmp = (single(1.0) / s) * (single(0.25) / (r * single(pi))); end
\begin{array}{l}
\\
\frac{1}{s} \cdot \frac{0.25}{r \cdot \pi}
\end{array}
Initial program 99.6%
Taylor expanded in r around 0
/-lowering-/.f32N/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f328.0%
Simplified8.0%
associate-*r*N/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f328.0%
Applied egg-rr8.0%
*-commutativeN/A
associate-*r*N/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f328.0%
Applied egg-rr8.0%
clear-numN/A
inv-powN/A
*-commutativeN/A
associate-/l*N/A
unpow-prod-downN/A
inv-powN/A
inv-powN/A
clear-numN/A
*-lowering-*.f32N/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
*-commutativeN/A
*-lowering-*.f32N/A
PI-lowering-PI.f328.0%
Applied egg-rr8.0%
(FPCore (s r) :precision binary32 (/ (/ 0.25 r) (* s PI)))
float code(float s, float r) {
return (0.25f / r) / (s * ((float) M_PI));
}
function code(s, r) return Float32(Float32(Float32(0.25) / r) / Float32(s * Float32(pi))) end
function tmp = code(s, r) tmp = (single(0.25) / r) / (s * single(pi)); end
\begin{array}{l}
\\
\frac{\frac{0.25}{r}}{s \cdot \pi}
\end{array}
Initial program 99.6%
Taylor expanded in r around 0
/-lowering-/.f32N/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f328.0%
Simplified8.0%
associate-/r*N/A
/-lowering-/.f32N/A
/-lowering-/.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f328.0%
Applied egg-rr8.0%
(FPCore (s r) :precision binary32 (/ 0.25 (* r (* s PI))))
float code(float s, float r) {
return 0.25f / (r * (s * ((float) M_PI)));
}
function code(s, r) return Float32(Float32(0.25) / Float32(r * Float32(s * Float32(pi)))) end
function tmp = code(s, r) tmp = single(0.25) / (r * (s * single(pi))); end
\begin{array}{l}
\\
\frac{0.25}{r \cdot \left(s \cdot \pi\right)}
\end{array}
Initial program 99.6%
Taylor expanded in r around 0
/-lowering-/.f32N/A
*-lowering-*.f32N/A
*-lowering-*.f32N/A
PI-lowering-PI.f328.0%
Simplified8.0%
herbie shell --seed 2024150
(FPCore (s r)
:name "Disney BSSRDF, PDF of scattering profile"
:precision binary32
:pre (and (and (<= 0.0 s) (<= s 256.0)) (and (< 1e-6 r) (< r 1000000.0)))
(+ (/ (* 0.25 (exp (/ (- r) s))) (* (* (* 2.0 PI) s) r)) (/ (* 0.75 (exp (/ (- r) (* 3.0 s)))) (* (* (* 6.0 PI) s) r))))