
(FPCore (u v) :precision binary32 (+ 1.0 (* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))))
float code(float u, float v) {
return 1.0f + (v * logf((u + ((1.0f - u) * expf((-2.0f / v))))));
}
real(4) function code(u, v)
real(4), intent (in) :: u
real(4), intent (in) :: v
code = 1.0e0 + (v * log((u + ((1.0e0 - u) * exp(((-2.0e0) / v))))))
end function
function code(u, v) return Float32(Float32(1.0) + Float32(v * log(Float32(u + Float32(Float32(Float32(1.0) - u) * exp(Float32(Float32(-2.0) / v))))))) end
function tmp = code(u, v) tmp = single(1.0) + (v * log((u + ((single(1.0) - u) * exp((single(-2.0) / v)))))); end
\begin{array}{l}
\\
1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 17 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (u v) :precision binary32 (+ 1.0 (* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))))
float code(float u, float v) {
return 1.0f + (v * logf((u + ((1.0f - u) * expf((-2.0f / v))))));
}
real(4) function code(u, v)
real(4), intent (in) :: u
real(4), intent (in) :: v
code = 1.0e0 + (v * log((u + ((1.0e0 - u) * exp(((-2.0e0) / v))))))
end function
function code(u, v) return Float32(Float32(1.0) + Float32(v * log(Float32(u + Float32(Float32(Float32(1.0) - u) * exp(Float32(Float32(-2.0) / v))))))) end
function tmp = code(u, v) tmp = single(1.0) + (v * log((u + ((single(1.0) - u) * exp((single(-2.0) / v)))))); end
\begin{array}{l}
\\
1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)
\end{array}
(FPCore (u v) :precision binary32 (+ 1.0 (* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))))
float code(float u, float v) {
return 1.0f + (v * logf((u + ((1.0f - u) * expf((-2.0f / v))))));
}
real(4) function code(u, v)
real(4), intent (in) :: u
real(4), intent (in) :: v
code = 1.0e0 + (v * log((u + ((1.0e0 - u) * exp(((-2.0e0) / v))))))
end function
function code(u, v) return Float32(Float32(1.0) + Float32(v * log(Float32(u + Float32(Float32(Float32(1.0) - u) * exp(Float32(Float32(-2.0) / v))))))) end
function tmp = code(u, v) tmp = single(1.0) + (v * log((u + ((single(1.0) - u) * exp((single(-2.0) / v)))))); end
\begin{array}{l}
\\
1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)
\end{array}
Initial program 99.7%
(FPCore (u v)
:precision binary32
(let* ((t_0 (* (- 1.0 u) (- 1.0 u))))
(if (<=
(* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))
-0.7879999876022339)
(fma
v
(/
(fma
(- 1.0 u)
2.0
(/
(fma
0.5
(fma -4.0 t_0 (* (- 1.0 u) 4.0))
(*
(/ (fma t_0 -24.0 (fma (* (- 1.0 u) t_0) 16.0 (* (- 1.0 u) 8.0))) v)
-0.16666666666666666))
(- v)))
(- v))
1.0)
1.0)))
float code(float u, float v) {
float t_0 = (1.0f - u) * (1.0f - u);
float tmp;
if ((v * logf((u + ((1.0f - u) * expf((-2.0f / v)))))) <= -0.7879999876022339f) {
tmp = fmaf(v, (fmaf((1.0f - u), 2.0f, (fmaf(0.5f, fmaf(-4.0f, t_0, ((1.0f - u) * 4.0f)), ((fmaf(t_0, -24.0f, fmaf(((1.0f - u) * t_0), 16.0f, ((1.0f - u) * 8.0f))) / v) * -0.16666666666666666f)) / -v)) / -v), 1.0f);
} else {
tmp = 1.0f;
}
return tmp;
}
function code(u, v) t_0 = Float32(Float32(Float32(1.0) - u) * Float32(Float32(1.0) - u)) tmp = Float32(0.0) if (Float32(v * log(Float32(u + Float32(Float32(Float32(1.0) - u) * exp(Float32(Float32(-2.0) / v)))))) <= Float32(-0.7879999876022339)) tmp = fma(v, Float32(fma(Float32(Float32(1.0) - u), Float32(2.0), Float32(fma(Float32(0.5), fma(Float32(-4.0), t_0, Float32(Float32(Float32(1.0) - u) * Float32(4.0))), Float32(Float32(fma(t_0, Float32(-24.0), fma(Float32(Float32(Float32(1.0) - u) * t_0), Float32(16.0), Float32(Float32(Float32(1.0) - u) * Float32(8.0)))) / v) * Float32(-0.16666666666666666))) / Float32(-v))) / Float32(-v)), Float32(1.0)); else tmp = Float32(1.0); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(1 - u\right) \cdot \left(1 - u\right)\\
\mathbf{if}\;v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \leq -0.7879999876022339:\\
\;\;\;\;\mathsf{fma}\left(v, \frac{\mathsf{fma}\left(1 - u, 2, \frac{\mathsf{fma}\left(0.5, \mathsf{fma}\left(-4, t\_0, \left(1 - u\right) \cdot 4\right), \frac{\mathsf{fma}\left(t\_0, -24, \mathsf{fma}\left(\left(1 - u\right) \cdot t\_0, 16, \left(1 - u\right) \cdot 8\right)\right)}{v} \cdot -0.16666666666666666\right)}{-v}\right)}{-v}, 1\right)\\
\mathbf{else}:\\
\;\;\;\;1\\
\end{array}
\end{array}
if (*.f32 v (log.f32 (+.f32 u (*.f32 (-.f32 #s(literal 1 binary32) u) (exp.f32 (/.f32 #s(literal -2 binary32) v)))))) < -0.787999988Initial program 92.7%
Taylor expanded in v around 0
+-commutativeN/A
lower-fma.f32N/A
lower-log.f32N/A
+-commutativeN/A
lower-fma.f32N/A
metadata-evalN/A
distribute-neg-fracN/A
metadata-evalN/A
associate-*r/N/A
lower-exp.f32N/A
associate-*r/N/A
metadata-evalN/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f32N/A
lower--.f3292.7
Applied rewrites92.7%
Taylor expanded in v around -inf
Applied rewrites69.3%
if -0.787999988 < (*.f32 v (log.f32 (+.f32 u (*.f32 (-.f32 #s(literal 1 binary32) u) (exp.f32 (/.f32 #s(literal -2 binary32) v)))))) Initial program 100.0%
Taylor expanded in v around 0
Applied rewrites92.8%
herbie shell --seed 2024223
(FPCore (u v)
:name "HairBSDF, sample_f, cosTheta"
:precision binary32
:pre (and (and (<= 1e-5 u) (<= u 1.0)) (and (<= 0.0 v) (<= v 109.746574)))
(+ 1.0 (* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))))