
(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 16 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
(*
(cos (* (* uy 2.0) (PI)))
(sqrt
(*
(* ux ux)
(+
(/ (+ 2.0 (* maxCos -2.0)) ux)
(+ (* maxCos (- 1.0 maxCos)) (+ maxCos -1.0)))))))\begin{array}{l}
\\
\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{\left(ux \cdot ux\right) \cdot \left(\frac{2 + maxCos \cdot -2}{ux} + \left(maxCos \cdot \left(1 - maxCos\right) + \left(maxCos + -1\right)\right)\right)}
\end{array}
Initial program 57.6%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3257.8
Applied rewrites57.8%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.7%
lift-/.f32N/A
+-commutativeN/A
distribute-rgt-inN/A
*-commutativeN/A
lift-/.f32N/A
div-invN/A
lift-/.f32N/A
associate-*l*N/A
lift-/.f32N/A
inv-powN/A
pow-plusN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
lower-+.f32N/A
lower-*.f3299.0
Applied rewrites99.0%
lift--.f32N/A
lift-*.f32N/A
lift-/.f32N/A
distribute-rgt-inN/A
+-commutativeN/A
lower-+.f32N/A
neg-mul-1N/A
lift-*.f32N/A
*-commutativeN/A
distribute-rgt-neg-inN/A
lower-*.f32N/A
lower-neg.f32N/A
lift-*.f32N/A
associate-*r*N/A
lift-/.f32N/A
inv-powN/A
pow-plusN/A
metadata-evalN/A
metadata-evalN/A
lower-*.f3299.0
Applied rewrites99.0%
Final simplification99.0%
(FPCore (ux uy maxCos)
:precision binary32
(*
(cos (* (* uy 2.0) (PI)))
(sqrt
(*
(* ux ux)
(-
(/ (+ 2.0 (* maxCos -2.0)) ux)
(fma (- 1.0 maxCos) (- maxCos) (- 1.0 maxCos)))))))\begin{array}{l}
\\
\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{\left(ux \cdot ux\right) \cdot \left(\frac{2 + maxCos \cdot -2}{ux} - \mathsf{fma}\left(1 - maxCos, -maxCos, 1 - maxCos\right)\right)}
\end{array}
Initial program 57.6%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3257.8
Applied rewrites57.8%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.7%
lift-/.f32N/A
+-commutativeN/A
distribute-rgt-inN/A
*-commutativeN/A
lift-/.f32N/A
div-invN/A
lift-/.f32N/A
associate-*l*N/A
lift-/.f32N/A
inv-powN/A
pow-plusN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
lower-+.f32N/A
lower-*.f3299.0
Applied rewrites99.0%
lift--.f32N/A
lift-*.f32N/A
lift-/.f32N/A
distribute-rgt-inN/A
+-commutativeN/A
neg-mul-1N/A
lift-*.f32N/A
*-commutativeN/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
lower-neg.f32N/A
lift-*.f32N/A
associate-*r*N/A
lift-/.f32N/A
inv-powN/A
pow-plusN/A
metadata-evalN/A
metadata-evalN/A
lower-*.f3286.8
Applied rewrites86.8%
Final simplification86.8%
(FPCore (ux uy maxCos)
:precision binary32
(if (<= (* uy 2.0) 0.0008200000156648457)
(sqrt
(*
(* ux ux)
(+ (/ (* -2.0 (+ maxCos -1.0)) ux) (* (- 1.0 maxCos) (+ maxCos -1.0)))))
(* (cos (* (* uy 2.0) (PI))) (sqrt (* (* ux ux) (+ -1.0 (/ 2.0 ux)))))))\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;uy \cdot 2 \leq 0.0008200000156648457:\\
\;\;\;\;\sqrt{\left(ux \cdot ux\right) \cdot \left(\frac{-2 \cdot \left(maxCos + -1\right)}{ux} + \left(1 - maxCos\right) \cdot \left(maxCos + -1\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{\left(ux \cdot ux\right) \cdot \left(-1 + \frac{2}{ux}\right)}\\
\end{array}
\end{array}
if (*.f32 uy #s(literal 2 binary32)) < 8.20000016e-4Initial program 58.5%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites31.4%
Taylor expanded in ux around inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
associate-*r/N/A
lower-/.f32N/A
*-commutativeN/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f3298.2
Applied rewrites98.2%
if 8.20000016e-4 < (*.f32 uy #s(literal 2 binary32)) Initial program 55.9%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3256.2
Applied rewrites56.2%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.6%
Taylor expanded in maxCos around 0
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f3294.2
Applied rewrites94.2%
Final simplification96.8%
(FPCore (ux uy maxCos) :precision binary32 (* (cos (* (* uy 2.0) (PI))) (sqrt (* (* ux ux) (+ (/ (+ 2.0 (* maxCos -2.0)) ux) -1.0)))))
\begin{array}{l}
\\
\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{\left(ux \cdot ux\right) \cdot \left(\frac{2 + maxCos \cdot -2}{ux} + -1\right)}
\end{array}
Initial program 57.6%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3257.8
Applied rewrites57.8%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.7%
lift-/.f32N/A
+-commutativeN/A
distribute-rgt-inN/A
*-commutativeN/A
lift-/.f32N/A
div-invN/A
lift-/.f32N/A
associate-*l*N/A
lift-/.f32N/A
inv-powN/A
pow-plusN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
lower-+.f32N/A
lower-*.f3299.0
Applied rewrites99.0%
Taylor expanded in maxCos around 0
Applied rewrites97.3%
Final simplification97.3%
(FPCore (ux uy maxCos)
:precision binary32
(if (<= (* uy 2.0) 0.0008200000156648457)
(sqrt
(*
(* ux ux)
(+ (/ (* -2.0 (+ maxCos -1.0)) ux) (* (- 1.0 maxCos) (+ maxCos -1.0)))))
(* (cos (* (* uy 2.0) (PI))) (sqrt (- (* 2.0 ux) (* ux ux))))))\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;uy \cdot 2 \leq 0.0008200000156648457:\\
\;\;\;\;\sqrt{\left(ux \cdot ux\right) \cdot \left(\frac{-2 \cdot \left(maxCos + -1\right)}{ux} + \left(1 - maxCos\right) \cdot \left(maxCos + -1\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{2 \cdot ux - ux \cdot ux}\\
\end{array}
\end{array}
if (*.f32 uy #s(literal 2 binary32)) < 8.20000016e-4Initial program 58.5%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites31.4%
Taylor expanded in ux around inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
associate-*r/N/A
lower-/.f32N/A
*-commutativeN/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f3298.2
Applied rewrites98.2%
if 8.20000016e-4 < (*.f32 uy #s(literal 2 binary32)) Initial program 55.9%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3256.2
Applied rewrites56.2%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.6%
Taylor expanded in maxCos around 0
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f3294.2
Applied rewrites94.2%
lift-*.f32N/A
lift-/.f32N/A
distribute-rgt-inN/A
+-commutativeN/A
lower-+.f32N/A
lift-*.f32N/A
associate-*r*N/A
neg-mul-1N/A
lower-*.f32N/A
lower-neg.f32N/A
lift-/.f32N/A
div-invN/A
associate-*l*N/A
inv-powN/A
lift-*.f32N/A
pow2N/A
pow-prod-upN/A
metadata-evalN/A
unpow1N/A
lower-*.f3294.1
Applied rewrites94.1%
Final simplification96.8%
(FPCore (ux uy maxCos)
:precision binary32
(if (<= (* uy 2.0) 0.0008200000156648457)
(sqrt
(*
(* ux ux)
(+ (/ (* -2.0 (+ maxCos -1.0)) ux) (* (- 1.0 maxCos) (+ maxCos -1.0)))))
(* (cos (* (* uy 2.0) (PI))) (sqrt (* ux (- 2.0 ux))))))\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;uy \cdot 2 \leq 0.0008200000156648457:\\
\;\;\;\;\sqrt{\left(ux \cdot ux\right) \cdot \left(\frac{-2 \cdot \left(maxCos + -1\right)}{ux} + \left(1 - maxCos\right) \cdot \left(maxCos + -1\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{ux \cdot \left(2 - ux\right)}\\
\end{array}
\end{array}
if (*.f32 uy #s(literal 2 binary32)) < 8.20000016e-4Initial program 58.5%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites31.4%
Taylor expanded in ux around inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
associate-*r/N/A
lower-/.f32N/A
*-commutativeN/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f3298.2
Applied rewrites98.2%
if 8.20000016e-4 < (*.f32 uy #s(literal 2 binary32)) Initial program 55.9%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3256.2
Applied rewrites56.2%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.6%
Taylor expanded in maxCos around 0
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f3294.2
Applied rewrites94.2%
Taylor expanded in ux around 0
lower-*.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f3293.9
Applied rewrites93.9%
Final simplification96.7%
(FPCore (ux uy maxCos)
:precision binary32
(if (<= (* uy 2.0) 0.006000000052154064)
(sqrt
(*
(* ux ux)
(+ (/ (* -2.0 (+ maxCos -1.0)) ux) (* (- 1.0 maxCos) (+ maxCos -1.0)))))
(* (cos (* (* uy 2.0) (PI))) (sqrt (* 2.0 ux)))))\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;uy \cdot 2 \leq 0.006000000052154064:\\
\;\;\;\;\sqrt{\left(ux \cdot ux\right) \cdot \left(\frac{-2 \cdot \left(maxCos + -1\right)}{ux} + \left(1 - maxCos\right) \cdot \left(maxCos + -1\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\cos \left(\left(uy \cdot 2\right) \cdot \mathsf{PI}\left(\right)\right) \cdot \sqrt{2 \cdot ux}\\
\end{array}
\end{array}
if (*.f32 uy #s(literal 2 binary32)) < 0.00600000005Initial program 59.5%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites31.4%
Taylor expanded in ux around inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
associate-*r/N/A
lower-/.f32N/A
*-commutativeN/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f3295.7
Applied rewrites95.7%
if 0.00600000005 < (*.f32 uy #s(literal 2 binary32)) Initial program 52.4%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3252.4
Applied rewrites52.4%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.5%
Taylor expanded in maxCos around 0
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f3293.4
Applied rewrites93.4%
Taylor expanded in ux around 0
lower-*.f3278.5
Applied rewrites78.5%
Final simplification91.2%
(FPCore (ux uy maxCos) :precision binary32 (sqrt (* (* ux ux) (+ (/ (* -2.0 (+ maxCos -1.0)) ux) (* (- 1.0 maxCos) (+ maxCos -1.0))))))
float code(float ux, float uy, float maxCos) {
return sqrtf(((ux * ux) * (((-2.0f * (maxCos + -1.0f)) / ux) + ((1.0f - maxCos) * (maxCos + -1.0f)))));
}
real(4) function code(ux, uy, maxcos)
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
code = sqrt(((ux * ux) * ((((-2.0e0) * (maxcos + (-1.0e0))) / ux) + ((1.0e0 - maxcos) * (maxcos + (-1.0e0))))))
end function
function code(ux, uy, maxCos) return sqrt(Float32(Float32(ux * ux) * Float32(Float32(Float32(Float32(-2.0) * Float32(maxCos + Float32(-1.0))) / ux) + Float32(Float32(Float32(1.0) - maxCos) * Float32(maxCos + Float32(-1.0)))))) end
function tmp = code(ux, uy, maxCos) tmp = sqrt(((ux * ux) * (((single(-2.0) * (maxCos + single(-1.0))) / ux) + ((single(1.0) - maxCos) * (maxCos + single(-1.0)))))); end
\begin{array}{l}
\\
\sqrt{\left(ux \cdot ux\right) \cdot \left(\frac{-2 \cdot \left(maxCos + -1\right)}{ux} + \left(1 - maxCos\right) \cdot \left(maxCos + -1\right)\right)}
\end{array}
Initial program 57.6%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites30.7%
Taylor expanded in ux around inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
mul-1-negN/A
unsub-negN/A
lower--.f32N/A
associate-*r/N/A
lower-/.f32N/A
*-commutativeN/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f3281.4
Applied rewrites81.4%
Final simplification81.4%
(FPCore (ux uy maxCos) :precision binary32 (sqrt (* ux (* maxCos (+ (+ -1.0 (- ux (/ ux maxCos))) (/ 2.0 maxCos))))))
float code(float ux, float uy, float maxCos) {
return sqrtf((ux * (maxCos * ((-1.0f + (ux - (ux / maxCos))) + (2.0f / 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((ux * (maxcos * (((-1.0e0) + (ux - (ux / maxcos))) + (2.0e0 / maxcos)))))
end function
function code(ux, uy, maxCos) return sqrt(Float32(ux * Float32(maxCos * Float32(Float32(Float32(-1.0) + Float32(ux - Float32(ux / maxCos))) + Float32(Float32(2.0) / maxCos))))) end
function tmp = code(ux, uy, maxCos) tmp = sqrt((ux * (maxCos * ((single(-1.0) + (ux - (ux / maxCos))) + (single(2.0) / maxCos))))); end
\begin{array}{l}
\\
\sqrt{ux \cdot \left(maxCos \cdot \left(\left(-1 + \left(ux - \frac{ux}{maxCos}\right)\right) + \frac{2}{maxCos}\right)\right)}
\end{array}
Initial program 57.6%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3257.8
Applied rewrites57.8%
Taylor expanded in maxCos around 0
lower--.f3255.8
Applied rewrites55.8%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
lower--.f32N/A
associate-*r*N/A
lower-*.f32N/A
lower-*.f32N/A
lower--.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3249.5
Applied rewrites49.5%
Taylor expanded in ux around 0
lower-*.f32N/A
distribute-lft-out--N/A
lower-*.f32N/A
associate--r-N/A
lower-+.f32N/A
Applied rewrites77.0%
Final simplification77.0%
(FPCore (ux uy maxCos) :precision binary32 (if (<= (+ (- 1.0 ux) (* ux maxCos)) 0.9997649788856506) (sqrt (+ 1.0 (* (- 1.0 ux) (+ ux -1.0)))) (sqrt (* -2.0 (* ux (+ maxCos -1.0))))))
float code(float ux, float uy, float maxCos) {
float tmp;
if (((1.0f - ux) + (ux * maxCos)) <= 0.9997649788856506f) {
tmp = sqrtf((1.0f + ((1.0f - ux) * (ux + -1.0f))));
} else {
tmp = sqrtf((-2.0f * (ux * (maxCos + -1.0f))));
}
return tmp;
}
real(4) function code(ux, uy, maxcos)
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
real(4) :: tmp
if (((1.0e0 - ux) + (ux * maxcos)) <= 0.9997649788856506e0) then
tmp = sqrt((1.0e0 + ((1.0e0 - ux) * (ux + (-1.0e0)))))
else
tmp = sqrt(((-2.0e0) * (ux * (maxcos + (-1.0e0)))))
end if
code = tmp
end function
function code(ux, uy, maxCos) tmp = Float32(0.0) if (Float32(Float32(Float32(1.0) - ux) + Float32(ux * maxCos)) <= Float32(0.9997649788856506)) tmp = sqrt(Float32(Float32(1.0) + Float32(Float32(Float32(1.0) - ux) * Float32(ux + Float32(-1.0))))); else tmp = sqrt(Float32(Float32(-2.0) * Float32(ux * Float32(maxCos + Float32(-1.0))))); end return tmp end
function tmp_2 = code(ux, uy, maxCos) tmp = single(0.0); if (((single(1.0) - ux) + (ux * maxCos)) <= single(0.9997649788856506)) tmp = sqrt((single(1.0) + ((single(1.0) - ux) * (ux + single(-1.0))))); else tmp = sqrt((single(-2.0) * (ux * (maxCos + single(-1.0))))); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;\left(1 - ux\right) + ux \cdot maxCos \leq 0.9997649788856506:\\
\;\;\;\;\sqrt{1 + \left(1 - ux\right) \cdot \left(ux + -1\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{-2 \cdot \left(ux \cdot \left(maxCos + -1\right)\right)}\\
\end{array}
\end{array}
if (+.f32 (-.f32 #s(literal 1 binary32) ux) (*.f32 ux maxCos)) < 0.999764979Initial program 90.4%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3290.0
Applied rewrites90.0%
Taylor expanded in maxCos around 0
lower--.f3285.4
Applied rewrites85.4%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
lower--.f32N/A
associate-*r*N/A
lower-*.f32N/A
lower-*.f32N/A
lower--.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3275.7
Applied rewrites75.7%
Taylor expanded in maxCos around 0
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower--.f3275.8
Applied rewrites75.8%
if 0.999764979 < (+.f32 (-.f32 #s(literal 1 binary32) ux) (*.f32 ux maxCos)) Initial program 37.3%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites30.6%
Taylor expanded in ux around 0
lower-*.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f3275.0
Applied rewrites75.0%
Final simplification75.3%
(FPCore (ux uy maxCos) :precision binary32 (sqrt (* (* ux ux) (+ -1.0 (/ 2.0 ux)))))
float code(float ux, float uy, float maxCos) {
return sqrtf(((ux * ux) * (-1.0f + (2.0f / ux))));
}
real(4) function code(ux, uy, maxcos)
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
code = sqrt(((ux * ux) * ((-1.0e0) + (2.0e0 / ux))))
end function
function code(ux, uy, maxCos) return sqrt(Float32(Float32(ux * ux) * Float32(Float32(-1.0) + Float32(Float32(2.0) / ux)))) end
function tmp = code(ux, uy, maxCos) tmp = sqrt(((ux * ux) * (single(-1.0) + (single(2.0) / ux)))); end
\begin{array}{l}
\\
\sqrt{\left(ux \cdot ux\right) \cdot \left(-1 + \frac{2}{ux}\right)}
\end{array}
Initial program 57.6%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3257.8
Applied rewrites57.8%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.7%
Taylor expanded in maxCos around 0
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f3292.8
Applied rewrites92.8%
Taylor expanded in uy around 0
Applied rewrites76.9%
Final simplification76.9%
(FPCore (ux uy maxCos) :precision binary32 (* ux (sqrt (+ -1.0 (/ 2.0 ux)))))
float code(float ux, float uy, float maxCos) {
return ux * sqrtf((-1.0f + (2.0f / ux)));
}
real(4) function code(ux, uy, maxcos)
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
code = ux * sqrt(((-1.0e0) + (2.0e0 / ux)))
end function
function code(ux, uy, maxCos) return Float32(ux * sqrt(Float32(Float32(-1.0) + Float32(Float32(2.0) / ux)))) end
function tmp = code(ux, uy, maxCos) tmp = ux * sqrt((single(-1.0) + (single(2.0) / ux))); end
\begin{array}{l}
\\
ux \cdot \sqrt{-1 + \frac{2}{ux}}
\end{array}
Initial program 57.6%
Taylor expanded in maxCos around inf
lower-*.f32N/A
associate--l+N/A
div-subN/A
lower-+.f32N/A
lower-/.f32N/A
lower--.f3257.8
Applied rewrites57.8%
Taylor expanded in ux around -inf
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
associate-*r*N/A
lower-*.f32N/A
Applied rewrites98.7%
Taylor expanded in uy around 0
Applied rewrites81.1%
Taylor expanded in maxCos around 0
lower-*.f32N/A
lower-sqrt.f32N/A
sub-negN/A
metadata-evalN/A
+-commutativeN/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f3276.8
Applied rewrites76.8%
(FPCore (ux uy maxCos) :precision binary32 (sqrt (* -2.0 (* ux (+ maxCos -1.0)))))
float code(float ux, float uy, float maxCos) {
return sqrtf((-2.0f * (ux * (maxCos + -1.0f))));
}
real(4) function code(ux, uy, maxcos)
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
code = sqrt(((-2.0e0) * (ux * (maxcos + (-1.0e0)))))
end function
function code(ux, uy, maxCos) return sqrt(Float32(Float32(-2.0) * Float32(ux * Float32(maxCos + Float32(-1.0))))) end
function tmp = code(ux, uy, maxCos) tmp = sqrt((single(-2.0) * (ux * (maxCos + single(-1.0))))); end
\begin{array}{l}
\\
\sqrt{-2 \cdot \left(ux \cdot \left(maxCos + -1\right)\right)}
\end{array}
Initial program 57.6%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites30.7%
Taylor expanded in ux around 0
lower-*.f32N/A
lower-*.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f3265.1
Applied rewrites65.1%
(FPCore (ux uy maxCos) :precision binary32 (sqrt (fma (- 1.0 ux) (+ ux -1.0) 1.0)))
float code(float ux, float uy, float maxCos) {
return sqrtf(fmaf((1.0f - ux), (ux + -1.0f), 1.0f));
}
function code(ux, uy, maxCos) return sqrt(fma(Float32(Float32(1.0) - ux), Float32(ux + Float32(-1.0)), Float32(1.0))) end
\begin{array}{l}
\\
\sqrt{\mathsf{fma}\left(1 - ux, ux + -1, 1\right)}
\end{array}
Initial program 57.6%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites30.7%
Taylor expanded in maxCos around 0
+-commutativeN/A
lower-fma.f32N/A
lower--.f32N/A
sub-negN/A
metadata-evalN/A
lower-+.f3219.9
Applied rewrites20.0%
(FPCore (ux uy maxCos) :precision binary32 (sqrt (fma -1.0 1.0 1.0)))
float code(float ux, float uy, float maxCos) {
return sqrtf(fmaf(-1.0f, 1.0f, 1.0f));
}
function code(ux, uy, maxCos) return sqrt(fma(Float32(-1.0), Float32(1.0), Float32(1.0))) end
\begin{array}{l}
\\
\sqrt{\mathsf{fma}\left(-1, 1, 1\right)}
\end{array}
Initial program 57.6%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites30.7%
Applied rewrites9.5%
Taylor expanded in ux around 0
Applied rewrites20.0%
(FPCore (ux uy maxCos) :precision binary32 0.0)
float code(float ux, float uy, float maxCos) {
return 0.0f;
}
real(4) function code(ux, uy, maxcos)
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
code = 0.0e0
end function
function code(ux, uy, maxCos) return Float32(0.0) end
function tmp = code(ux, uy, maxCos) tmp = single(0.0); end
\begin{array}{l}
\\
0
\end{array}
Initial program 57.6%
Taylor expanded in uy around 0
lower-sqrt.f32N/A
sub-negN/A
+-commutativeN/A
unpow2N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Applied rewrites30.7%
Applied rewrites9.5%
Taylor expanded in ux around 0
Applied rewrites19.9%
lift-fma.f32N/A
pow1/2N/A
lift-fma.f32N/A
metadata-evalN/A
metadata-evalN/A
metadata-eval6.6
Applied rewrites6.6%
herbie shell --seed 2024219
(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)))))))