
(FPCore (s u) :precision binary32 (* s (log (/ 1.0 (- 1.0 (* 4.0 u))))))
float code(float s, float u) {
return s * logf((1.0f / (1.0f - (4.0f * u))));
}
real(4) function code(s, u)
real(4), intent (in) :: s
real(4), intent (in) :: u
code = s * log((1.0e0 / (1.0e0 - (4.0e0 * u))))
end function
function code(s, u) return Float32(s * log(Float32(Float32(1.0) / Float32(Float32(1.0) - Float32(Float32(4.0) * u))))) end
function tmp = code(s, u) tmp = s * log((single(1.0) / (single(1.0) - (single(4.0) * u)))); end
\begin{array}{l}
\\
s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right)
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (s u) :precision binary32 (* s (log (/ 1.0 (- 1.0 (* 4.0 u))))))
float code(float s, float u) {
return s * logf((1.0f / (1.0f - (4.0f * u))));
}
real(4) function code(s, u)
real(4), intent (in) :: s
real(4), intent (in) :: u
code = s * log((1.0e0 / (1.0e0 - (4.0e0 * u))))
end function
function code(s, u) return Float32(s * log(Float32(Float32(1.0) / Float32(Float32(1.0) - Float32(Float32(4.0) * u))))) end
function tmp = code(s, u) tmp = s * log((single(1.0) / (single(1.0) - (single(4.0) * u)))); end
\begin{array}{l}
\\
s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right)
\end{array}
(FPCore (s u)
:precision binary32
(let* ((t_0 (- 1.0 (* u 4.0))))
(if (<= t_0 0.9959999918937683)
(* (log (/ 1.0 t_0)) s)
(* (exp (- (* 2.0 u) (- (log 0.25) (log u)))) s))))
float code(float s, float u) {
float t_0 = 1.0f - (u * 4.0f);
float tmp;
if (t_0 <= 0.9959999918937683f) {
tmp = logf((1.0f / t_0)) * s;
} else {
tmp = expf(((2.0f * u) - (logf(0.25f) - logf(u)))) * s;
}
return tmp;
}
real(4) function code(s, u)
real(4), intent (in) :: s
real(4), intent (in) :: u
real(4) :: t_0
real(4) :: tmp
t_0 = 1.0e0 - (u * 4.0e0)
if (t_0 <= 0.9959999918937683e0) then
tmp = log((1.0e0 / t_0)) * s
else
tmp = exp(((2.0e0 * u) - (log(0.25e0) - log(u)))) * s
end if
code = tmp
end function
function code(s, u) t_0 = Float32(Float32(1.0) - Float32(u * Float32(4.0))) tmp = Float32(0.0) if (t_0 <= Float32(0.9959999918937683)) tmp = Float32(log(Float32(Float32(1.0) / t_0)) * s); else tmp = Float32(exp(Float32(Float32(Float32(2.0) * u) - Float32(log(Float32(0.25)) - log(u)))) * s); end return tmp end
function tmp_2 = code(s, u) t_0 = single(1.0) - (u * single(4.0)); tmp = single(0.0); if (t_0 <= single(0.9959999918937683)) tmp = log((single(1.0) / t_0)) * s; else tmp = exp(((single(2.0) * u) - (log(single(0.25)) - log(u)))) * s; end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 1 - u \cdot 4\\
\mathbf{if}\;t\_0 \leq 0.9959999918937683:\\
\;\;\;\;\log \left(\frac{1}{t\_0}\right) \cdot s\\
\mathbf{else}:\\
\;\;\;\;e^{2 \cdot u - \left(\log 0.25 - \log u\right)} \cdot s\\
\end{array}
\end{array}
if (-.f32 #s(literal 1 binary32) (*.f32 #s(literal 4 binary32) u)) < 0.995999992Initial program 92.3%
if 0.995999992 < (-.f32 #s(literal 1 binary32) (*.f32 #s(literal 4 binary32) u)) Initial program 49.4%
Applied rewrites70.5%
Taylor expanded in u around 0
lower-/.f3285.1
Applied rewrites85.1%
lift-/.f32N/A
inv-powN/A
pow-to-expN/A
lower-exp.f32N/A
lower-*.f32N/A
lower-log.f3283.2
Applied rewrites83.2%
Taylor expanded in u around 0
+-commutativeN/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
lower-*.f32N/A
mul-1-negN/A
unsub-negN/A
remove-double-negN/A
mul-1-negN/A
mul-1-negN/A
mul-1-negN/A
log-recN/A
lower--.f32N/A
lower-log.f32N/A
log-recN/A
mul-1-negN/A
mul-1-negN/A
mul-1-negN/A
remove-double-negN/A
lower-log.f3292.8
Applied rewrites92.8%
Final simplification92.7%
(FPCore (s u)
:precision binary32
(let* ((t_0 (- 1.0 (* u 4.0))))
(if (<= t_0 0.999750018119812)
(* (log (/ 1.0 t_0)) s)
(* (/ 1.0 (/ 0.25 u)) s))))
float code(float s, float u) {
float t_0 = 1.0f - (u * 4.0f);
float tmp;
if (t_0 <= 0.999750018119812f) {
tmp = logf((1.0f / t_0)) * s;
} else {
tmp = (1.0f / (0.25f / u)) * s;
}
return tmp;
}
real(4) function code(s, u)
real(4), intent (in) :: s
real(4), intent (in) :: u
real(4) :: t_0
real(4) :: tmp
t_0 = 1.0e0 - (u * 4.0e0)
if (t_0 <= 0.999750018119812e0) then
tmp = log((1.0e0 / t_0)) * s
else
tmp = (1.0e0 / (0.25e0 / u)) * s
end if
code = tmp
end function
function code(s, u) t_0 = Float32(Float32(1.0) - Float32(u * Float32(4.0))) tmp = Float32(0.0) if (t_0 <= Float32(0.999750018119812)) tmp = Float32(log(Float32(Float32(1.0) / t_0)) * s); else tmp = Float32(Float32(Float32(1.0) / Float32(Float32(0.25) / u)) * s); end return tmp end
function tmp_2 = code(s, u) t_0 = single(1.0) - (u * single(4.0)); tmp = single(0.0); if (t_0 <= single(0.999750018119812)) tmp = log((single(1.0) / t_0)) * s; else tmp = (single(1.0) / (single(0.25) / u)) * s; end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 1 - u \cdot 4\\
\mathbf{if}\;t\_0 \leq 0.999750018119812:\\
\;\;\;\;\log \left(\frac{1}{t\_0}\right) \cdot s\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{0.25}{u}} \cdot s\\
\end{array}
\end{array}
if (-.f32 #s(literal 1 binary32) (*.f32 #s(literal 4 binary32) u)) < 0.999750018Initial program 87.2%
if 0.999750018 < (-.f32 #s(literal 1 binary32) (*.f32 #s(literal 4 binary32) u)) Initial program 42.3%
Applied rewrites86.8%
Taylor expanded in u around 0
lower-/.f3291.0
Applied rewrites91.0%
Final simplification89.4%
(FPCore (s u) :precision binary32 (* (/ 1.0 (/ 0.25 u)) s))
float code(float s, float u) {
return (1.0f / (0.25f / u)) * s;
}
real(4) function code(s, u)
real(4), intent (in) :: s
real(4), intent (in) :: u
code = (1.0e0 / (0.25e0 / u)) * s
end function
function code(s, u) return Float32(Float32(Float32(1.0) / Float32(Float32(0.25) / u)) * s) end
function tmp = code(s, u) tmp = (single(1.0) / (single(0.25) / u)) * s; end
\begin{array}{l}
\\
\frac{1}{\frac{0.25}{u}} \cdot s
\end{array}
Initial program 62.0%
Applied rewrites50.1%
Taylor expanded in u around 0
lower-/.f3272.1
Applied rewrites72.1%
Final simplification72.1%
(FPCore (s u) :precision binary32 (* (* u 4.0) s))
float code(float s, float u) {
return (u * 4.0f) * s;
}
real(4) function code(s, u)
real(4), intent (in) :: s
real(4), intent (in) :: u
code = (u * 4.0e0) * s
end function
function code(s, u) return Float32(Float32(u * Float32(4.0)) * s) end
function tmp = code(s, u) tmp = (u * single(4.0)) * s; end
\begin{array}{l}
\\
\left(u \cdot 4\right) \cdot s
\end{array}
Initial program 62.0%
Taylor expanded in u around 0
*-commutativeN/A
lower-*.f3272.1
Applied rewrites72.1%
Final simplification72.1%
herbie shell --seed 2024266
(FPCore (s u)
:name "Disney BSSRDF, sample scattering profile, lower"
:precision binary32
:pre (and (and (<= 0.0 s) (<= s 256.0)) (and (<= 2.328306437e-10 u) (<= u 0.25)))
(* s (log (/ 1.0 (- 1.0 (* 4.0 u))))))