
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (- (log (- 1.0 u1)))) (cos (* (* 2.0 PI) u2))))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(-logf((1.0f - u1))) * cosf(((2.0f * ((float) M_PI)) * u2));
}
function code(cosTheta_i, u1, u2) return Float32(sqrt(Float32(-log(Float32(Float32(1.0) - u1)))) * cos(Float32(Float32(Float32(2.0) * Float32(pi)) * u2))) end
function tmp = code(cosTheta_i, u1, u2) tmp = sqrt(-log((single(1.0) - u1))) * cos(((single(2.0) * single(pi)) * u2)); end
\begin{array}{l}
\\
\sqrt{-\log \left(1 - u1\right)} \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right)
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 15 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (- (log (- 1.0 u1)))) (cos (* (* 2.0 PI) u2))))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(-logf((1.0f - u1))) * cosf(((2.0f * ((float) M_PI)) * u2));
}
function code(cosTheta_i, u1, u2) return Float32(sqrt(Float32(-log(Float32(Float32(1.0) - u1)))) * cos(Float32(Float32(Float32(2.0) * Float32(pi)) * u2))) end
function tmp = code(cosTheta_i, u1, u2) tmp = sqrt(-log((single(1.0) - u1))) * cos(((single(2.0) * single(pi)) * u2)); end
\begin{array}{l}
\\
\sqrt{-\log \left(1 - u1\right)} \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right)
\end{array}
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (- (log1p (- u1)))) (- (fma 0.5 (cos (* 2.0 (* (* PI (log E)) u2))) 0.5) (fma (cos (* 2.0 (* PI u2))) -0.5 0.5))))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(-log1pf(-u1)) * (fmaf(0.5f, cosf((2.0f * ((((float) M_PI) * logf(((float) M_E))) * u2))), 0.5f) - fmaf(cosf((2.0f * (((float) M_PI) * u2))), -0.5f, 0.5f));
}
function code(cosTheta_i, u1, u2) return Float32(sqrt(Float32(-log1p(Float32(-u1)))) * Float32(fma(Float32(0.5), cos(Float32(Float32(2.0) * Float32(Float32(Float32(pi) * log(Float32(exp(1)))) * u2))), Float32(0.5)) - fma(cos(Float32(Float32(2.0) * Float32(Float32(pi) * u2))), Float32(-0.5), Float32(0.5)))) end
\begin{array}{l}
\\
\sqrt{-\mathsf{log1p}\left(-u1\right)} \cdot \left(\mathsf{fma}\left(0.5, \cos \left(2 \cdot \left(\left(\pi \cdot \log e\right) \cdot u2\right)\right), 0.5\right) - \mathsf{fma}\left(\cos \left(2 \cdot \left(\pi \cdot u2\right)\right), -0.5, 0.5\right)\right)
\end{array}
Initial program 57.4%
sub-negN/A
lower-log1p.f32N/A
lower-neg.f3299.0
Applied rewrites99.0%
lift-PI.f32N/A
associate-*l*N/A
cos-2N/A
lower--.f32N/A
Applied rewrites98.9%
lift-PI.f32N/A
lift-*.f32N/A
lift-*.f32N/A
lift-cos.f32N/A
lift-*.f32N/A
lift-PI.f32N/A
lift-*.f32N/A
lift-*.f32N/A
lift-cos.f32N/A
lift-*.f32N/A
lift--.f32N/A
Applied rewrites98.9%
add-log-expN/A
*-un-lft-identityN/A
lift-PI.f32N/A
exp-prodN/A
log-powN/A
lower-*.f32N/A
lower-log.f32N/A
exp-1-eN/A
lower-E.f3299.0
Applied rewrites99.0%
(FPCore (cosTheta_i u1 u2)
:precision binary32
(let* ((t_0 (cos (* u2 (* 2.0 PI)))))
(if (<= (* t_0 (sqrt (- (log (- 1.0 u1))))) 0.17000000178813934)
(*
t_0
(sqrt (fma (* u1 u1) (fma u1 (fma u1 0.25 0.3333333333333333) 0.5) u1)))
(* (sqrt (- (log1p (- u1)))) (fma (* PI PI) (* -2.0 (* u2 u2)) 1.0)))))
float code(float cosTheta_i, float u1, float u2) {
float t_0 = cosf((u2 * (2.0f * ((float) M_PI))));
float tmp;
if ((t_0 * sqrtf(-logf((1.0f - u1)))) <= 0.17000000178813934f) {
tmp = t_0 * sqrtf(fmaf((u1 * u1), fmaf(u1, fmaf(u1, 0.25f, 0.3333333333333333f), 0.5f), u1));
} else {
tmp = sqrtf(-log1pf(-u1)) * fmaf((((float) M_PI) * ((float) M_PI)), (-2.0f * (u2 * u2)), 1.0f);
}
return tmp;
}
function code(cosTheta_i, u1, u2) t_0 = cos(Float32(u2 * Float32(Float32(2.0) * Float32(pi)))) tmp = Float32(0.0) if (Float32(t_0 * sqrt(Float32(-log(Float32(Float32(1.0) - u1))))) <= Float32(0.17000000178813934)) tmp = Float32(t_0 * sqrt(fma(Float32(u1 * u1), fma(u1, fma(u1, Float32(0.25), Float32(0.3333333333333333)), Float32(0.5)), u1))); else tmp = Float32(sqrt(Float32(-log1p(Float32(-u1)))) * fma(Float32(Float32(pi) * Float32(pi)), Float32(Float32(-2.0) * Float32(u2 * u2)), Float32(1.0))); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \cos \left(u2 \cdot \left(2 \cdot \pi\right)\right)\\
\mathbf{if}\;t\_0 \cdot \sqrt{-\log \left(1 - u1\right)} \leq 0.17000000178813934:\\
\;\;\;\;t\_0 \cdot \sqrt{\mathsf{fma}\left(u1 \cdot u1, \mathsf{fma}\left(u1, \mathsf{fma}\left(u1, 0.25, 0.3333333333333333\right), 0.5\right), u1\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{-\mathsf{log1p}\left(-u1\right)} \cdot \mathsf{fma}\left(\pi \cdot \pi, -2 \cdot \left(u2 \cdot u2\right), 1\right)\\
\end{array}
\end{array}
if (*.f32 (sqrt.f32 (neg.f32 (log.f32 (-.f32 #s(literal 1 binary32) u1)))) (cos.f32 (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2))) < 0.170000002Initial program 50.6%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
unpow2N/A
*-rgt-identityN/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3298.9
Applied rewrites98.9%
if 0.170000002 < (*.f32 (sqrt.f32 (neg.f32 (log.f32 (-.f32 #s(literal 1 binary32) u1)))) (cos.f32 (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2))) Initial program 97.6%
sub-negN/A
lower-log1p.f32N/A
lower-neg.f3298.8
Applied rewrites98.8%
Taylor expanded in u2 around 0
+-commutativeN/A
*-commutativeN/A
associate-*r*N/A
*-commutativeN/A
associate-*l*N/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
lower-PI.f32N/A
lower-PI.f32N/A
lower-*.f32N/A
unpow2N/A
lower-*.f3289.9
Applied rewrites89.9%
Final simplification97.6%
(FPCore (cosTheta_i u1 u2)
:precision binary32
(let* ((t_0 (cos (* u2 (* 2.0 PI)))))
(if (<= (* t_0 (sqrt (- (log (- 1.0 u1))))) 0.13500000536441803)
(* t_0 (sqrt (fma (* u1 u1) (fma u1 0.3333333333333333 0.5) u1)))
(* (sqrt (- (log1p (- u1)))) (fma (* PI PI) (* -2.0 (* u2 u2)) 1.0)))))
float code(float cosTheta_i, float u1, float u2) {
float t_0 = cosf((u2 * (2.0f * ((float) M_PI))));
float tmp;
if ((t_0 * sqrtf(-logf((1.0f - u1)))) <= 0.13500000536441803f) {
tmp = t_0 * sqrtf(fmaf((u1 * u1), fmaf(u1, 0.3333333333333333f, 0.5f), u1));
} else {
tmp = sqrtf(-log1pf(-u1)) * fmaf((((float) M_PI) * ((float) M_PI)), (-2.0f * (u2 * u2)), 1.0f);
}
return tmp;
}
function code(cosTheta_i, u1, u2) t_0 = cos(Float32(u2 * Float32(Float32(2.0) * Float32(pi)))) tmp = Float32(0.0) if (Float32(t_0 * sqrt(Float32(-log(Float32(Float32(1.0) - u1))))) <= Float32(0.13500000536441803)) tmp = Float32(t_0 * sqrt(fma(Float32(u1 * u1), fma(u1, Float32(0.3333333333333333), Float32(0.5)), u1))); else tmp = Float32(sqrt(Float32(-log1p(Float32(-u1)))) * fma(Float32(Float32(pi) * Float32(pi)), Float32(Float32(-2.0) * Float32(u2 * u2)), Float32(1.0))); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \cos \left(u2 \cdot \left(2 \cdot \pi\right)\right)\\
\mathbf{if}\;t\_0 \cdot \sqrt{-\log \left(1 - u1\right)} \leq 0.13500000536441803:\\
\;\;\;\;t\_0 \cdot \sqrt{\mathsf{fma}\left(u1 \cdot u1, \mathsf{fma}\left(u1, 0.3333333333333333, 0.5\right), u1\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{-\mathsf{log1p}\left(-u1\right)} \cdot \mathsf{fma}\left(\pi \cdot \pi, -2 \cdot \left(u2 \cdot u2\right), 1\right)\\
\end{array}
\end{array}
if (*.f32 (sqrt.f32 (neg.f32 (log.f32 (-.f32 #s(literal 1 binary32) u1)))) (cos.f32 (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2))) < 0.135000005Initial program 49.5%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
unpow2N/A
*-rgt-identityN/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3298.2
Applied rewrites98.2%
if 0.135000005 < (*.f32 (sqrt.f32 (neg.f32 (log.f32 (-.f32 #s(literal 1 binary32) u1)))) (cos.f32 (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2))) Initial program 97.4%
sub-negN/A
lower-log1p.f32N/A
lower-neg.f3298.9
Applied rewrites98.9%
Taylor expanded in u2 around 0
+-commutativeN/A
*-commutativeN/A
associate-*r*N/A
*-commutativeN/A
associate-*l*N/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
lower-PI.f32N/A
lower-PI.f32N/A
lower-*.f32N/A
unpow2N/A
lower-*.f3291.1
Applied rewrites91.1%
Final simplification97.1%
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (- (log1p (- u1)))) (cos (* u2 (* 2.0 PI)))))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(-log1pf(-u1)) * cosf((u2 * (2.0f * ((float) M_PI))));
}
function code(cosTheta_i, u1, u2) return Float32(sqrt(Float32(-log1p(Float32(-u1)))) * cos(Float32(u2 * Float32(Float32(2.0) * Float32(pi))))) end
\begin{array}{l}
\\
\sqrt{-\mathsf{log1p}\left(-u1\right)} \cdot \cos \left(u2 \cdot \left(2 \cdot \pi\right)\right)
\end{array}
Initial program 57.4%
sub-negN/A
lower-log1p.f32N/A
lower-neg.f3299.0
Applied rewrites99.0%
Final simplification99.0%
(FPCore (cosTheta_i u1 u2)
:precision binary32
(let* ((t_0 (* u2 (* 2.0 PI))))
(if (<= t_0 0.09449999779462814)
(* (sqrt (- (log1p (- u1)))) (fma (* PI PI) (* -2.0 (* u2 u2)) 1.0))
(* (cos t_0) (sqrt (* (- u1) (fma u1 -0.5 -1.0)))))))
float code(float cosTheta_i, float u1, float u2) {
float t_0 = u2 * (2.0f * ((float) M_PI));
float tmp;
if (t_0 <= 0.09449999779462814f) {
tmp = sqrtf(-log1pf(-u1)) * fmaf((((float) M_PI) * ((float) M_PI)), (-2.0f * (u2 * u2)), 1.0f);
} else {
tmp = cosf(t_0) * sqrtf((-u1 * fmaf(u1, -0.5f, -1.0f)));
}
return tmp;
}
function code(cosTheta_i, u1, u2) t_0 = Float32(u2 * Float32(Float32(2.0) * Float32(pi))) tmp = Float32(0.0) if (t_0 <= Float32(0.09449999779462814)) tmp = Float32(sqrt(Float32(-log1p(Float32(-u1)))) * fma(Float32(Float32(pi) * Float32(pi)), Float32(Float32(-2.0) * Float32(u2 * u2)), Float32(1.0))); else tmp = Float32(cos(t_0) * sqrt(Float32(Float32(-u1) * fma(u1, Float32(-0.5), Float32(-1.0))))); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := u2 \cdot \left(2 \cdot \pi\right)\\
\mathbf{if}\;t\_0 \leq 0.09449999779462814:\\
\;\;\;\;\sqrt{-\mathsf{log1p}\left(-u1\right)} \cdot \mathsf{fma}\left(\pi \cdot \pi, -2 \cdot \left(u2 \cdot u2\right), 1\right)\\
\mathbf{else}:\\
\;\;\;\;\cos t\_0 \cdot \sqrt{\left(-u1\right) \cdot \mathsf{fma}\left(u1, -0.5, -1\right)}\\
\end{array}
\end{array}
if (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2) < 0.0944999978Initial program 56.0%
sub-negN/A
lower-log1p.f32N/A
lower-neg.f3299.4
Applied rewrites99.4%
Taylor expanded in u2 around 0
+-commutativeN/A
*-commutativeN/A
associate-*r*N/A
*-commutativeN/A
associate-*l*N/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
lower-PI.f32N/A
lower-PI.f32N/A
lower-*.f32N/A
unpow2N/A
lower-*.f3298.9
Applied rewrites98.9%
if 0.0944999978 < (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2) Initial program 64.9%
Taylor expanded in u1 around 0
lower-*.f32N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
lower-fma.f3280.6
Applied rewrites80.6%
Final simplification96.1%
(FPCore (cosTheta_i u1 u2)
:precision binary32
(let* ((t_0 (* u2 (* 2.0 PI))))
(if (<= t_0 0.0015399999683722854)
(sqrt (- (log1p (- u1))))
(* (cos t_0) (sqrt (* (- u1) (fma u1 -0.5 -1.0)))))))
float code(float cosTheta_i, float u1, float u2) {
float t_0 = u2 * (2.0f * ((float) M_PI));
float tmp;
if (t_0 <= 0.0015399999683722854f) {
tmp = sqrtf(-log1pf(-u1));
} else {
tmp = cosf(t_0) * sqrtf((-u1 * fmaf(u1, -0.5f, -1.0f)));
}
return tmp;
}
function code(cosTheta_i, u1, u2) t_0 = Float32(u2 * Float32(Float32(2.0) * Float32(pi))) tmp = Float32(0.0) if (t_0 <= Float32(0.0015399999683722854)) tmp = sqrt(Float32(-log1p(Float32(-u1)))); else tmp = Float32(cos(t_0) * sqrt(Float32(Float32(-u1) * fma(u1, Float32(-0.5), Float32(-1.0))))); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := u2 \cdot \left(2 \cdot \pi\right)\\
\mathbf{if}\;t\_0 \leq 0.0015399999683722854:\\
\;\;\;\;\sqrt{-\mathsf{log1p}\left(-u1\right)}\\
\mathbf{else}:\\
\;\;\;\;\cos t\_0 \cdot \sqrt{\left(-u1\right) \cdot \mathsf{fma}\left(u1, -0.5, -1\right)}\\
\end{array}
\end{array}
if (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2) < 0.00153999997Initial program 54.9%
Taylor expanded in u2 around 0
Applied rewrites54.7%
sub-negN/A
lift-neg.f32N/A
lift-log1p.f3299.1
Applied rewrites99.1%
if 0.00153999997 < (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2) Initial program 61.9%
Taylor expanded in u1 around 0
lower-*.f32N/A
sub-negN/A
*-commutativeN/A
metadata-evalN/A
lower-fma.f3285.4
Applied rewrites85.4%
Final simplification94.2%
(FPCore (cosTheta_i u1 u2)
:precision binary32
(let* ((t_0 (* u2 (* 2.0 PI))))
(if (<= t_0 0.0015399999683722854)
(sqrt (- (log1p (- u1))))
(* (cos t_0) (sqrt (fma u1 (* u1 0.5) u1))))))
float code(float cosTheta_i, float u1, float u2) {
float t_0 = u2 * (2.0f * ((float) M_PI));
float tmp;
if (t_0 <= 0.0015399999683722854f) {
tmp = sqrtf(-log1pf(-u1));
} else {
tmp = cosf(t_0) * sqrtf(fmaf(u1, (u1 * 0.5f), u1));
}
return tmp;
}
function code(cosTheta_i, u1, u2) t_0 = Float32(u2 * Float32(Float32(2.0) * Float32(pi))) tmp = Float32(0.0) if (t_0 <= Float32(0.0015399999683722854)) tmp = sqrt(Float32(-log1p(Float32(-u1)))); else tmp = Float32(cos(t_0) * sqrt(fma(u1, Float32(u1 * Float32(0.5)), u1))); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := u2 \cdot \left(2 \cdot \pi\right)\\
\mathbf{if}\;t\_0 \leq 0.0015399999683722854:\\
\;\;\;\;\sqrt{-\mathsf{log1p}\left(-u1\right)}\\
\mathbf{else}:\\
\;\;\;\;\cos t\_0 \cdot \sqrt{\mathsf{fma}\left(u1, u1 \cdot 0.5, u1\right)}\\
\end{array}
\end{array}
if (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2) < 0.00153999997Initial program 54.9%
Taylor expanded in u2 around 0
Applied rewrites54.7%
sub-negN/A
lift-neg.f32N/A
lift-log1p.f3299.1
Applied rewrites99.1%
if 0.00153999997 < (*.f32 (*.f32 #s(literal 2 binary32) (PI.f32)) u2) Initial program 61.9%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
*-rgt-identityN/A
lower-fma.f32N/A
*-commutativeN/A
lower-*.f3285.3
Applied rewrites85.3%
Final simplification94.2%
(FPCore (cosTheta_i u1 u2)
:precision binary32
(fma
(*
u2
(*
(* PI (fma PI (* (* PI PI) (* (* u2 u2) 0.6666666666666666)) (* PI -2.0)))
(sqrt (fma u1 (* u1 (fma u1 0.3333333333333333 0.5)) u1))))
u2
(sqrt (fma (* u1 u1) (fma u1 (fma u1 0.25 0.3333333333333333) 0.5) u1))))
float code(float cosTheta_i, float u1, float u2) {
return fmaf((u2 * ((((float) M_PI) * fmaf(((float) M_PI), ((((float) M_PI) * ((float) M_PI)) * ((u2 * u2) * 0.6666666666666666f)), (((float) M_PI) * -2.0f))) * sqrtf(fmaf(u1, (u1 * fmaf(u1, 0.3333333333333333f, 0.5f)), u1)))), u2, sqrtf(fmaf((u1 * u1), fmaf(u1, fmaf(u1, 0.25f, 0.3333333333333333f), 0.5f), u1)));
}
function code(cosTheta_i, u1, u2) return fma(Float32(u2 * Float32(Float32(Float32(pi) * fma(Float32(pi), Float32(Float32(Float32(pi) * Float32(pi)) * Float32(Float32(u2 * u2) * Float32(0.6666666666666666))), Float32(Float32(pi) * Float32(-2.0)))) * sqrt(fma(u1, Float32(u1 * fma(u1, Float32(0.3333333333333333), Float32(0.5))), u1)))), u2, sqrt(fma(Float32(u1 * u1), fma(u1, fma(u1, Float32(0.25), Float32(0.3333333333333333)), Float32(0.5)), u1))) end
\begin{array}{l}
\\
\mathsf{fma}\left(u2 \cdot \left(\left(\pi \cdot \mathsf{fma}\left(\pi, \left(\pi \cdot \pi\right) \cdot \left(\left(u2 \cdot u2\right) \cdot 0.6666666666666666\right), \pi \cdot -2\right)\right) \cdot \sqrt{\mathsf{fma}\left(u1, u1 \cdot \mathsf{fma}\left(u1, 0.3333333333333333, 0.5\right), u1\right)}\right), u2, \sqrt{\mathsf{fma}\left(u1 \cdot u1, \mathsf{fma}\left(u1, \mathsf{fma}\left(u1, 0.25, 0.3333333333333333\right), 0.5\right), u1\right)}\right)
\end{array}
Initial program 57.4%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
unpow2N/A
*-rgt-identityN/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3293.8
Applied rewrites93.8%
Taylor expanded in u2 around 0
+-commutativeN/A
lower-fma.f32N/A
Applied rewrites88.9%
Taylor expanded in u1 around 0
Applied rewrites89.0%
Applied rewrites89.0%
(FPCore (cosTheta_i u1 u2) :precision binary32 (fma (* u2 u2) (* (sqrt (fma (* u1 u1) (fma u1 0.3333333333333333 0.5) u1)) (* PI (* PI -2.0))) (sqrt (fma (* u1 u1) (fma u1 (fma u1 0.25 0.3333333333333333) 0.5) u1))))
float code(float cosTheta_i, float u1, float u2) {
return fmaf((u2 * u2), (sqrtf(fmaf((u1 * u1), fmaf(u1, 0.3333333333333333f, 0.5f), u1)) * (((float) M_PI) * (((float) M_PI) * -2.0f))), sqrtf(fmaf((u1 * u1), fmaf(u1, fmaf(u1, 0.25f, 0.3333333333333333f), 0.5f), u1)));
}
function code(cosTheta_i, u1, u2) return fma(Float32(u2 * u2), Float32(sqrt(fma(Float32(u1 * u1), fma(u1, Float32(0.3333333333333333), Float32(0.5)), u1)) * Float32(Float32(pi) * Float32(Float32(pi) * Float32(-2.0)))), sqrt(fma(Float32(u1 * u1), fma(u1, fma(u1, Float32(0.25), Float32(0.3333333333333333)), Float32(0.5)), u1))) end
\begin{array}{l}
\\
\mathsf{fma}\left(u2 \cdot u2, \sqrt{\mathsf{fma}\left(u1 \cdot u1, \mathsf{fma}\left(u1, 0.3333333333333333, 0.5\right), u1\right)} \cdot \left(\pi \cdot \left(\pi \cdot -2\right)\right), \sqrt{\mathsf{fma}\left(u1 \cdot u1, \mathsf{fma}\left(u1, \mathsf{fma}\left(u1, 0.25, 0.3333333333333333\right), 0.5\right), u1\right)}\right)
\end{array}
Initial program 57.4%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
unpow2N/A
*-rgt-identityN/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3293.8
Applied rewrites93.8%
Taylor expanded in u2 around 0
+-commutativeN/A
lower-fma.f32N/A
Applied rewrites88.9%
Taylor expanded in u1 around 0
Applied rewrites89.0%
Taylor expanded in u2 around 0
*-commutativeN/A
unpow2N/A
associate-*l*N/A
lower-*.f32N/A
lower-PI.f32N/A
lower-*.f32N/A
lower-PI.f3286.5
Applied rewrites86.5%
(FPCore (cosTheta_i u1 u2) :precision binary32 (fma -2.0 (* (* u2 u2) (* (* PI PI) (sqrt (fma u1 (* u1 (fma 0.3333333333333333 u1 0.5)) u1)))) (sqrt (fma (* u1 u1) (fma u1 (fma u1 0.25 0.3333333333333333) 0.5) u1))))
float code(float cosTheta_i, float u1, float u2) {
return fmaf(-2.0f, ((u2 * u2) * ((((float) M_PI) * ((float) M_PI)) * sqrtf(fmaf(u1, (u1 * fmaf(0.3333333333333333f, u1, 0.5f)), u1)))), sqrtf(fmaf((u1 * u1), fmaf(u1, fmaf(u1, 0.25f, 0.3333333333333333f), 0.5f), u1)));
}
function code(cosTheta_i, u1, u2) return fma(Float32(-2.0), Float32(Float32(u2 * u2) * Float32(Float32(Float32(pi) * Float32(pi)) * sqrt(fma(u1, Float32(u1 * fma(Float32(0.3333333333333333), u1, Float32(0.5))), u1)))), sqrt(fma(Float32(u1 * u1), fma(u1, fma(u1, Float32(0.25), Float32(0.3333333333333333)), Float32(0.5)), u1))) end
\begin{array}{l}
\\
\mathsf{fma}\left(-2, \left(u2 \cdot u2\right) \cdot \left(\left(\pi \cdot \pi\right) \cdot \sqrt{\mathsf{fma}\left(u1, u1 \cdot \mathsf{fma}\left(0.3333333333333333, u1, 0.5\right), u1\right)}\right), \sqrt{\mathsf{fma}\left(u1 \cdot u1, \mathsf{fma}\left(u1, \mathsf{fma}\left(u1, 0.25, 0.3333333333333333\right), 0.5\right), u1\right)}\right)
\end{array}
Initial program 57.4%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
unpow2N/A
*-rgt-identityN/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3293.8
Applied rewrites93.8%
Taylor expanded in u2 around 0
+-commutativeN/A
lower-fma.f32N/A
Applied rewrites88.9%
Taylor expanded in u1 around 0
Applied rewrites89.0%
Taylor expanded in u2 around 0
+-commutativeN/A
lower-fma.f32N/A
Applied rewrites86.5%
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (fma (* u1 u1) (fma u1 (fma u1 0.25 0.3333333333333333) 0.5) u1)) (fma (* PI PI) (* -2.0 (* u2 u2)) 1.0)))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(fmaf((u1 * u1), fmaf(u1, fmaf(u1, 0.25f, 0.3333333333333333f), 0.5f), u1)) * fmaf((((float) M_PI) * ((float) M_PI)), (-2.0f * (u2 * u2)), 1.0f);
}
function code(cosTheta_i, u1, u2) return Float32(sqrt(fma(Float32(u1 * u1), fma(u1, fma(u1, Float32(0.25), Float32(0.3333333333333333)), Float32(0.5)), u1)) * fma(Float32(Float32(pi) * Float32(pi)), Float32(Float32(-2.0) * Float32(u2 * u2)), Float32(1.0))) end
\begin{array}{l}
\\
\sqrt{\mathsf{fma}\left(u1 \cdot u1, \mathsf{fma}\left(u1, \mathsf{fma}\left(u1, 0.25, 0.3333333333333333\right), 0.5\right), u1\right)} \cdot \mathsf{fma}\left(\pi \cdot \pi, -2 \cdot \left(u2 \cdot u2\right), 1\right)
\end{array}
Initial program 57.4%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
unpow2N/A
*-rgt-identityN/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3293.8
Applied rewrites93.8%
Taylor expanded in u2 around 0
associate-*r*N/A
distribute-rgt1-inN/A
*-commutativeN/A
associate-*r*N/A
*-commutativeN/A
+-commutativeN/A
lower-*.f32N/A
Applied rewrites86.4%
Final simplification86.4%
(FPCore (cosTheta_i u1 u2) :precision binary32 (sqrt (fma (* u1 u1) (fma u1 (fma u1 0.25 0.3333333333333333) 0.5) u1)))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(fmaf((u1 * u1), fmaf(u1, fmaf(u1, 0.25f, 0.3333333333333333f), 0.5f), u1));
}
function code(cosTheta_i, u1, u2) return sqrt(fma(Float32(u1 * u1), fma(u1, fma(u1, Float32(0.25), Float32(0.3333333333333333)), Float32(0.5)), u1)) end
\begin{array}{l}
\\
\sqrt{\mathsf{fma}\left(u1 \cdot u1, \mathsf{fma}\left(u1, \mathsf{fma}\left(u1, 0.25, 0.3333333333333333\right), 0.5\right), u1\right)}
\end{array}
Initial program 57.4%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
unpow2N/A
*-rgt-identityN/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3293.8
Applied rewrites93.8%
Taylor expanded in u2 around 0
lower-sqrt.f32N/A
+-commutativeN/A
lower-fma.f32N/A
unpow2N/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3279.3
Applied rewrites79.3%
(FPCore (cosTheta_i u1 u2) :precision binary32 (sqrt (fma u1 (* u1 (fma u1 0.3333333333333333 0.5)) u1)))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(fmaf(u1, (u1 * fmaf(u1, 0.3333333333333333f, 0.5f)), u1));
}
function code(cosTheta_i, u1, u2) return sqrt(fma(u1, Float32(u1 * fma(u1, Float32(0.3333333333333333), Float32(0.5))), u1)) end
\begin{array}{l}
\\
\sqrt{\mathsf{fma}\left(u1, u1 \cdot \mathsf{fma}\left(u1, 0.3333333333333333, 0.5\right), u1\right)}
\end{array}
Initial program 57.4%
Taylor expanded in u2 around 0
Applied rewrites49.2%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
*-rgt-identityN/A
lower-fma.f32N/A
lower-*.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f3278.3
Applied rewrites78.3%
Final simplification78.3%
(FPCore (cosTheta_i u1 u2) :precision binary32 (sqrt (fma u1 (* u1 0.5) u1)))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(fmaf(u1, (u1 * 0.5f), u1));
}
function code(cosTheta_i, u1, u2) return sqrt(fma(u1, Float32(u1 * Float32(0.5)), u1)) end
\begin{array}{l}
\\
\sqrt{\mathsf{fma}\left(u1, u1 \cdot 0.5, u1\right)}
\end{array}
Initial program 57.4%
Taylor expanded in u2 around 0
Applied rewrites49.2%
Taylor expanded in u1 around 0
+-commutativeN/A
distribute-lft-inN/A
*-rgt-identityN/A
lower-fma.f32N/A
*-commutativeN/A
lower-*.f3276.1
Applied rewrites76.1%
Final simplification76.1%
(FPCore (cosTheta_i u1 u2) :precision binary32 (sqrt u1))
float code(float cosTheta_i, float u1, float u2) {
return sqrtf(u1);
}
real(4) function code(costheta_i, u1, u2)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: u1
real(4), intent (in) :: u2
code = sqrt(u1)
end function
function code(cosTheta_i, u1, u2) return sqrt(u1) end
function tmp = code(cosTheta_i, u1, u2) tmp = sqrt(u1); end
\begin{array}{l}
\\
\sqrt{u1}
\end{array}
Initial program 57.4%
Taylor expanded in u2 around 0
Applied rewrites49.2%
Applied rewrites36.1%
Taylor expanded in u1 around 0
lower-sqrt.f3267.6
Applied rewrites67.6%
herbie shell --seed 2024214
(FPCore (cosTheta_i u1 u2)
:name "Beckmann Sample, near normal, slope_x"
:precision binary32
:pre (and (and (and (> cosTheta_i 0.9999) (<= cosTheta_i 1.0)) (and (<= 2.328306437e-10 u1) (<= u1 1.0))) (and (<= 2.328306437e-10 u2) (<= u2 1.0)))
(* (sqrt (- (log (- 1.0 u1)))) (cos (* (* 2.0 PI) u2))))