
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (- (log (- 1.0 u1)))) (sin (* (* 2.0 (PI)) u2))))
\begin{array}{l}
\\
\sqrt{-\log \left(1 - u1\right)} \cdot \sin \left(\left(2 \cdot \mathsf{PI}\left(\right)\right) \cdot u2\right)
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (- (log (- 1.0 u1)))) (sin (* (* 2.0 (PI)) u2))))
\begin{array}{l}
\\
\sqrt{-\log \left(1 - u1\right)} \cdot \sin \left(\left(2 \cdot \mathsf{PI}\left(\right)\right) \cdot u2\right)
\end{array}
(FPCore (cosTheta_i u1 u2)
:precision binary32
(let* ((t_0 (* (* 0.5 u1) u1)) (t_1 (sin (* (* (PI) 2.0) u2))))
(if (<= (- 1.0 u1) 0.9975500106811523)
(* t_1 (sqrt (- (log (- 1.0 u1)))))
(* (sqrt (* (/ 1.0 (- t_0 u1)) (- (pow t_0 2.0) (* u1 u1)))) t_1))))\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(0.5 \cdot u1\right) \cdot u1\\
t_1 := \sin \left(\left(\mathsf{PI}\left(\right) \cdot 2\right) \cdot u2\right)\\
\mathbf{if}\;1 - u1 \leq 0.9975500106811523:\\
\;\;\;\;t\_1 \cdot \sqrt{-\log \left(1 - u1\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\frac{1}{t\_0 - u1} \cdot \left({t\_0}^{2} - u1 \cdot u1\right)} \cdot t\_1\\
\end{array}
\end{array}
if (-.f32 #s(literal 1 binary32) u1) < 0.99755001Initial program 94.0%
if 0.99755001 < (-.f32 #s(literal 1 binary32) u1) Initial program 41.8%
Taylor expanded in u1 around 0
mul-1-negN/A
lower-neg.f3289.2
Applied rewrites89.2%
Taylor expanded in u1 around 0
*-commutativeN/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f3240.0
Applied rewrites39.5%
Applied rewrites98.2%
Applied rewrites98.2%
Final simplification97.1%
(FPCore (cosTheta_i u1 u2)
:precision binary32
(let* ((t_0 (sin (* (* (PI) 2.0) u2))))
(if (<= (- 1.0 u1) 0.9975500106811523)
(* t_0 (sqrt (- (log (- 1.0 u1)))))
(* (sqrt (+ (* (* 0.5 u1) u1) u1)) t_0))))\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sin \left(\left(\mathsf{PI}\left(\right) \cdot 2\right) \cdot u2\right)\\
\mathbf{if}\;1 - u1 \leq 0.9975500106811523:\\
\;\;\;\;t\_0 \cdot \sqrt{-\log \left(1 - u1\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\left(0.5 \cdot u1\right) \cdot u1 + u1} \cdot t\_0\\
\end{array}
\end{array}
if (-.f32 #s(literal 1 binary32) u1) < 0.99755001Initial program 94.0%
if 0.99755001 < (-.f32 #s(literal 1 binary32) u1) Initial program 41.8%
Taylor expanded in u1 around 0
mul-1-negN/A
lower-neg.f3289.2
Applied rewrites89.2%
Taylor expanded in u1 around 0
*-commutativeN/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f3239.7
Applied rewrites38.5%
Applied rewrites98.2%
Final simplification97.1%
(FPCore (cosTheta_i u1 u2)
:precision binary32
(if (<= (- 1.0 u1) 0.9919000267982483)
(*
(sqrt (log (sqrt (/ 1.0 (- 1.0 u1)))))
(* (* (* (sqrt 2.0) (PI)) u2) 2.0))
(* (sqrt (+ (* (* 0.5 u1) u1) u1)) (sin (* (* (PI) 2.0) u2)))))\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;1 - u1 \leq 0.9919000267982483:\\
\;\;\;\;\sqrt{\log \left(\sqrt{\frac{1}{1 - u1}}\right)} \cdot \left(\left(\left(\sqrt{2} \cdot \mathsf{PI}\left(\right)\right) \cdot u2\right) \cdot 2\right)\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\left(0.5 \cdot u1\right) \cdot u1 + u1} \cdot \sin \left(\left(\mathsf{PI}\left(\right) \cdot 2\right) \cdot u2\right)\\
\end{array}
\end{array}
if (-.f32 #s(literal 1 binary32) u1) < 0.991900027Initial program 95.1%
lift-neg.f32N/A
lift-log.f32N/A
neg-logN/A
inv-powN/A
sqr-powN/A
log-prodN/A
lower-+.f32N/A
lower-log.f32N/A
lower-pow.f32N/A
metadata-evalN/A
lower-log.f32N/A
lower-pow.f32N/A
metadata-eval91.7
Applied rewrites91.7%
Taylor expanded in u2 around 0
associate-*r*N/A
lower-*.f32N/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-sqrt.f32N/A
lower-PI.f32N/A
lower-sqrt.f32N/A
lower-log.f32N/A
lower-sqrt.f32N/A
sub-negN/A
mul-1-negN/A
lower-/.f32N/A
mul-1-negN/A
sub-negN/A
lower--.f3284.3
Applied rewrites84.3%
if 0.991900027 < (-.f32 #s(literal 1 binary32) u1) Initial program 45.1%
Taylor expanded in u1 around 0
mul-1-negN/A
lower-neg.f3286.9
Applied rewrites86.9%
Taylor expanded in u1 around 0
*-commutativeN/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f3237.8
Applied rewrites39.0%
Applied rewrites97.1%
Final simplification94.4%
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (+ (* (* 0.5 u1) u1) u1)) (sin (* (* (PI) 2.0) u2))))
\begin{array}{l}
\\
\sqrt{\left(0.5 \cdot u1\right) \cdot u1 + u1} \cdot \sin \left(\left(\mathsf{PI}\left(\right) \cdot 2\right) \cdot u2\right)
\end{array}
Initial program 55.4%
Taylor expanded in u1 around 0
mul-1-negN/A
lower-neg.f3278.2
Applied rewrites78.2%
Taylor expanded in u1 around 0
*-commutativeN/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f3236.1
Applied rewrites36.3%
Applied rewrites89.2%
Final simplification89.2%
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt (* (+ (* 0.5 u1) 1.0) u1)) (sin (* (* (PI) 2.0) u2))))
\begin{array}{l}
\\
\sqrt{\left(0.5 \cdot u1 + 1\right) \cdot u1} \cdot \sin \left(\left(\mathsf{PI}\left(\right) \cdot 2\right) \cdot u2\right)
\end{array}
Initial program 55.4%
Taylor expanded in u1 around 0
mul-1-negN/A
lower-neg.f3278.2
Applied rewrites78.2%
Taylor expanded in u1 around 0
*-commutativeN/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f3237.4
Applied rewrites35.4%
Applied rewrites89.2%
Final simplification89.2%
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (sqrt u1) (sin (* (* u2 (PI)) 2.0))))
\begin{array}{l}
\\
\sqrt{u1} \cdot \sin \left(\left(u2 \cdot \mathsf{PI}\left(\right)\right) \cdot 2\right)
\end{array}
Initial program 55.4%
Applied rewrites35.7%
Taylor expanded in u1 around 0
*-commutativeN/A
lower-*.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
lower-sqrt.f3278.2
Applied rewrites78.2%
Final simplification78.2%
(FPCore (cosTheta_i u1 u2) :precision binary32 (* (* (PI) 2.0) (* (sqrt u1) u2)))
\begin{array}{l}
\\
\left(\mathsf{PI}\left(\right) \cdot 2\right) \cdot \left(\sqrt{u1} \cdot u2\right)
\end{array}
Initial program 55.4%
Applied rewrites37.1%
Taylor expanded in u1 around 0
*-commutativeN/A
lower-*.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
lower-sqrt.f3278.2
Applied rewrites78.2%
Taylor expanded in u2 around 0
Applied rewrites68.5%
Applied rewrites68.6%
Final simplification68.6%
herbie shell --seed 2024332
(FPCore (cosTheta_i u1 u2)
:name "Beckmann Sample, near normal, slope_y"
: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)))) (sin (* (* 2.0 (PI)) u2))))