
(FPCore (ux uy maxCos) :precision binary32 (let* ((t_0 (+ (- 1.0 ux) (* ux maxCos)))) (* (cos (* (* uy 2.0) (PI))) (sqrt (- 1.0 (* t_0 t_0))))))
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(1 - ux\right) + ux \cdot maxCos\\
\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{1 - t\_0 \cdot t\_0}
\end{array}
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 9 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (ux uy maxCos) :precision binary32 (let* ((t_0 (+ (- 1.0 ux) (* ux maxCos)))) (* (cos (* (* uy 2.0) (PI))) (sqrt (- 1.0 (* t_0 t_0))))))
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(1 - ux\right) + ux \cdot maxCos\\
\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{1 - t\_0 \cdot t\_0}
\end{array}
\end{array}
(FPCore (ux uy maxCos) :precision binary32 (* (sqrt (* (- 2.0 (- (* (pow (- maxCos 1.0) 2.0) ux) (* -2.0 maxCos))) ux)) (cos (* (PI) (* 2.0 uy)))))
\begin{array}{l}
\\
\sqrt{\left(2 - \left({\left(maxCos - 1\right)}^{2} \cdot ux - -2 \cdot maxCos\right)\right) \cdot ux} \cdot \cos \left(\mathsf{PI}\left(\right) \cdot \left(2 \cdot uy\right)\right)
\end{array}
Initial program 57.2%
Taylor expanded in ux around 0
*-commutativeN/A
lower-*.f32N/A
cancel-sign-sub-invN/A
metadata-evalN/A
+-commutativeN/A
lower-fma.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-pow.f32N/A
lower--.f322.5
Applied rewrites4.0%
Applied rewrites98.9%
Final simplification98.9%
(FPCore (ux uy maxCos)
:precision binary32
(let* ((t_0 (cos (* (PI) (* 2.0 uy)))))
(if (<= maxCos 3.999999886872274e-9)
(* (sqrt (* (- 2.0 ux) ux)) t_0)
(*
(sqrt
(*
(* ux ux)
(*
(-
(/ (- (/ 2.0 (* maxCos maxCos)) (/ 2.0 maxCos)) ux)
(- (/ 1.0 (* maxCos maxCos)) (- (/ 2.0 maxCos) 1.0)))
(* maxCos maxCos))))
t_0))))\begin{array}{l}
\\
\begin{array}{l}
t_0 := \cos \left(\mathsf{PI}\left(\right) \cdot \left(2 \cdot uy\right)\right)\\
\mathbf{if}\;maxCos \leq 3.999999886872274 \cdot 10^{-9}:\\
\;\;\;\;\sqrt{\left(2 - ux\right) \cdot ux} \cdot t\_0\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\left(ux \cdot ux\right) \cdot \left(\left(\frac{\frac{2}{maxCos \cdot maxCos} - \frac{2}{maxCos}}{ux} - \left(\frac{1}{maxCos \cdot maxCos} - \left(\frac{2}{maxCos} - 1\right)\right)\right) \cdot \left(maxCos \cdot maxCos\right)\right)} \cdot t\_0\\
\end{array}
\end{array}
if maxCos < 3.99999989e-9Initial program 56.5%
Taylor expanded in ux around 0
*-commutativeN/A
lower-*.f32N/A
cancel-sign-sub-invN/A
metadata-evalN/A
+-commutativeN/A
lower-fma.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-pow.f32N/A
lower--.f320.7
Applied rewrites1.2%
Taylor expanded in maxCos around 0
Applied rewrites99.1%
if 3.99999989e-9 < maxCos Initial program 59.6%
Taylor expanded in ux around inf
*-commutativeN/A
lower-*.f32N/A
associate--r+N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
div-subN/A
cancel-sign-sub-invN/A
metadata-evalN/A
lower--.f32N/A
lower-/.f32N/A
+-commutativeN/A
lower-fma.f32N/A
lower-pow.f32N/A
lower--.f32N/A
unpow2N/A
lower-*.f3249.6
Applied rewrites49.6%
Taylor expanded in maxCos around inf
Applied rewrites98.1%
Taylor expanded in ux around inf
Applied rewrites98.2%
Final simplification98.9%
(FPCore (ux uy maxCos)
:precision binary32
(let* ((t_0 (cos (* (PI) (* 2.0 uy)))))
(if (<= maxCos 8.599999823388771e-9)
(* (sqrt (* (- 2.0 ux) ux)) t_0)
(*
(sqrt
(*
(-
(/
(* (- (/ (- (/ 2.0 ux) 1.0) maxCos) (- (/ 2.0 ux) 2.0)) (* ux ux))
maxCos)
(* ux ux))
(* maxCos maxCos)))
t_0))))\begin{array}{l}
\\
\begin{array}{l}
t_0 := \cos \left(\mathsf{PI}\left(\right) \cdot \left(2 \cdot uy\right)\right)\\
\mathbf{if}\;maxCos \leq 8.599999823388771 \cdot 10^{-9}:\\
\;\;\;\;\sqrt{\left(2 - ux\right) \cdot ux} \cdot t\_0\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\left(\frac{\left(\frac{\frac{2}{ux} - 1}{maxCos} - \left(\frac{2}{ux} - 2\right)\right) \cdot \left(ux \cdot ux\right)}{maxCos} - ux \cdot ux\right) \cdot \left(maxCos \cdot maxCos\right)} \cdot t\_0\\
\end{array}
\end{array}
if maxCos < 8.59999982e-9Initial program 56.3%
Taylor expanded in ux around 0
*-commutativeN/A
lower-*.f32N/A
cancel-sign-sub-invN/A
metadata-evalN/A
+-commutativeN/A
lower-fma.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-pow.f32N/A
lower--.f321.2
Applied rewrites1.2%
Taylor expanded in maxCos around 0
Applied rewrites99.1%
if 8.59999982e-9 < maxCos Initial program 60.4%
Taylor expanded in ux around inf
*-commutativeN/A
lower-*.f32N/A
associate--r+N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
div-subN/A
cancel-sign-sub-invN/A
metadata-evalN/A
lower--.f32N/A
lower-/.f32N/A
+-commutativeN/A
lower-fma.f32N/A
lower-pow.f32N/A
lower--.f32N/A
unpow2N/A
lower-*.f3247.9
Applied rewrites47.9%
Taylor expanded in maxCos around inf
Applied rewrites98.1%
Taylor expanded in maxCos around inf
Applied rewrites98.1%
Final simplification98.9%
(FPCore (ux uy maxCos) :precision binary32 (if (<= (+ (* maxCos ux) (- 1.0 ux)) 0.9999999403953552) (sqrt (- 1.0 (pow (- (+ (* maxCos ux) 1.0) ux) 2.0))) (* (sqrt (* 2.0 ux)) (fma (PI) (* (* (* uy uy) -2.0) (PI)) 1.0))))
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;maxCos \cdot ux + \left(1 - ux\right) \leq 0.9999999403953552:\\
\;\;\;\;\sqrt{1 - {\left(\left(maxCos \cdot ux + 1\right) - ux\right)}^{2}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{2 \cdot ux} \cdot \mathsf{fma}\left(\mathsf{PI}\left(\right), \left(\left(uy \cdot uy\right) \cdot -2\right) \cdot \mathsf{PI}\left(\right), 1\right)\\
\end{array}
\end{array}
if (+.f32 (-.f32 #s(literal 1 binary32) ux) (*.f32 ux maxCos)) < 0.99999994Initial program 72.6%
Taylor expanded in ux around inf
*-commutativeN/A
lower-*.f32N/A
associate--r+N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
div-subN/A
cancel-sign-sub-invN/A
metadata-evalN/A
lower--.f32N/A
lower-/.f32N/A
+-commutativeN/A
lower-fma.f32N/A
lower-pow.f32N/A
lower--.f32N/A
unpow2N/A
lower-*.f3266.0
Applied rewrites66.0%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
lower--.f32N/A
lower-pow.f32N/A
lower--.f32N/A
+-commutativeN/A
lower-fma.f3258.9
Applied rewrites58.6%
Applied rewrites60.4%
if 0.99999994 < (+.f32 (-.f32 #s(literal 1 binary32) ux) (*.f32 ux maxCos)) Initial program 6.8%
Taylor expanded in uy around 0
+-commutativeN/A
associate-*r*N/A
lower-fma.f32N/A
*-commutativeN/A
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower-PI.f32N/A
lower-PI.f326.8
Applied rewrites6.8%
Taylor expanded in ux around 0
cancel-sign-sub-invN/A
metadata-evalN/A
*-commutativeN/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f3278.2
Applied rewrites76.6%
Taylor expanded in maxCos around 0
Applied rewrites76.6%
Applied rewrites76.6%
Final simplification64.6%
(FPCore (ux uy maxCos) :precision binary32 (* (sqrt (* (- 2.0 ux) ux)) (cos (* (PI) (* 2.0 uy)))))
\begin{array}{l}
\\
\sqrt{\left(2 - ux\right) \cdot ux} \cdot \cos \left(\mathsf{PI}\left(\right) \cdot \left(2 \cdot uy\right)\right)
\end{array}
Initial program 57.2%
Taylor expanded in ux around 0
*-commutativeN/A
lower-*.f32N/A
cancel-sign-sub-invN/A
metadata-evalN/A
+-commutativeN/A
lower-fma.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-pow.f32N/A
lower--.f322.6
Applied rewrites1.8%
Taylor expanded in maxCos around 0
Applied rewrites93.9%
Final simplification93.9%
(FPCore (ux uy maxCos) :precision binary32 (* (sqrt (* 2.0 ux)) (fma (PI) (* (* (* uy uy) -2.0) (PI)) 1.0)))
\begin{array}{l}
\\
\sqrt{2 \cdot ux} \cdot \mathsf{fma}\left(\mathsf{PI}\left(\right), \left(\left(uy \cdot uy\right) \cdot -2\right) \cdot \mathsf{PI}\left(\right), 1\right)
\end{array}
Initial program 57.2%
Taylor expanded in uy around 0
+-commutativeN/A
associate-*r*N/A
lower-fma.f32N/A
*-commutativeN/A
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower-PI.f32N/A
lower-PI.f3247.9
Applied rewrites47.9%
Taylor expanded in ux around 0
cancel-sign-sub-invN/A
metadata-evalN/A
*-commutativeN/A
lower-*.f32N/A
+-commutativeN/A
lower-fma.f3261.5
Applied rewrites61.5%
Taylor expanded in maxCos around 0
Applied rewrites61.4%
Applied rewrites61.5%
Final simplification61.5%
(FPCore (ux uy maxCos) :precision binary32 (let* ((t_0 (- (fma ux maxCos 1.0) ux))) (sqrt (- 1.0 (* t_0 t_0)))))
float code(float ux, float uy, float maxCos) {
float t_0 = fmaf(ux, maxCos, 1.0f) - ux;
return sqrtf((1.0f - (t_0 * t_0)));
}
function code(ux, uy, maxCos) t_0 = Float32(fma(ux, maxCos, Float32(1.0)) - ux) return sqrt(Float32(Float32(1.0) - Float32(t_0 * t_0))) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \mathsf{fma}\left(ux, maxCos, 1\right) - ux\\
\sqrt{1 - t\_0 \cdot t\_0}
\end{array}
\end{array}
Initial program 57.2%
Taylor expanded in ux around inf
*-commutativeN/A
lower-*.f32N/A
associate--r+N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
div-subN/A
cancel-sign-sub-invN/A
metadata-evalN/A
lower--.f32N/A
lower-/.f32N/A
+-commutativeN/A
lower-fma.f32N/A
lower-pow.f32N/A
lower--.f32N/A
unpow2N/A
lower-*.f3268.1
Applied rewrites67.7%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
lower--.f32N/A
lower-pow.f32N/A
lower--.f32N/A
+-commutativeN/A
lower-fma.f3246.7
Applied rewrites46.5%
Applied rewrites46.7%
(FPCore (ux uy maxCos) :precision binary32 (sqrt (- 1.0 (* (* (* maxCos ux) ux) maxCos))))
float code(float ux, float uy, float maxCos) {
return sqrtf((1.0f - (((maxCos * ux) * ux) * maxCos)));
}
real(4) function code(ux, uy, maxcos)
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
code = sqrt((1.0e0 - (((maxcos * ux) * ux) * maxcos)))
end function
function code(ux, uy, maxCos) return sqrt(Float32(Float32(1.0) - Float32(Float32(Float32(maxCos * ux) * ux) * maxCos))) end
function tmp = code(ux, uy, maxCos) tmp = sqrt((single(1.0) - (((maxCos * ux) * ux) * maxCos))); end
\begin{array}{l}
\\
\sqrt{1 - \left(\left(maxCos \cdot ux\right) \cdot ux\right) \cdot maxCos}
\end{array}
Initial program 57.2%
Taylor expanded in ux around inf
*-commutativeN/A
lower-*.f32N/A
associate--r+N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
div-subN/A
cancel-sign-sub-invN/A
metadata-evalN/A
lower--.f32N/A
lower-/.f32N/A
+-commutativeN/A
lower-fma.f32N/A
lower-pow.f32N/A
lower--.f32N/A
unpow2N/A
lower-*.f3267.8
Applied rewrites67.7%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
lower--.f32N/A
lower-pow.f32N/A
lower--.f32N/A
+-commutativeN/A
lower-fma.f3246.7
Applied rewrites46.5%
Taylor expanded in maxCos around inf
Applied rewrites19.6%
Final simplification19.6%
(FPCore (ux uy maxCos) :precision binary32 (* (* (sqrt -1.0) ux) maxCos))
float code(float ux, float uy, float maxCos) {
return (sqrtf(-1.0f) * ux) * maxCos;
}
real(4) function code(ux, uy, maxcos)
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
code = (sqrt((-1.0e0)) * ux) * maxcos
end function
function code(ux, uy, maxCos) return Float32(Float32(sqrt(Float32(-1.0)) * ux) * maxCos) end
function tmp = code(ux, uy, maxCos) tmp = (sqrt(single(-1.0)) * ux) * maxCos; end
\begin{array}{l}
\\
\left(\sqrt{-1} \cdot ux\right) \cdot maxCos
\end{array}
Initial program 57.2%
Taylor expanded in ux around inf
*-commutativeN/A
lower-*.f32N/A
associate--r+N/A
associate-*r/N/A
metadata-evalN/A
associate-*r/N/A
div-subN/A
cancel-sign-sub-invN/A
metadata-evalN/A
lower--.f32N/A
lower-/.f32N/A
+-commutativeN/A
lower-fma.f32N/A
lower-pow.f32N/A
lower--.f32N/A
unpow2N/A
lower-*.f3267.7
Applied rewrites67.9%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
lower--.f32N/A
lower-pow.f32N/A
lower--.f32N/A
+-commutativeN/A
lower-fma.f3246.7
Applied rewrites46.5%
Taylor expanded in maxCos around inf
Applied rewrites-0.0%
herbie shell --seed 2024332
(FPCore (ux uy maxCos)
:name "UniformSampleCone, x"
:precision binary32
:pre (and (and (and (<= 2.328306437e-10 ux) (<= ux 1.0)) (and (<= 2.328306437e-10 uy) (<= uy 1.0))) (and (<= 0.0 maxCos) (<= maxCos 1.0)))
(* (cos (* (* uy 2.0) (PI))) (sqrt (- 1.0 (* (+ (- 1.0 ux) (* ux maxCos)) (+ (- 1.0 ux) (* ux maxCos)))))))