(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(+
(+
(*
(*
(cos (* (* uy 2.0) PI))
(sqrt
(- 1.0 (* (* (* (- 1.0 ux) maxCos) ux) (* (* (- 1.0 ux) maxCos) ux)))))
xi)
(*
(*
(sin (* (* uy 2.0) PI))
(sqrt
(- 1.0 (* (* (* (- 1.0 ux) maxCos) ux) (* (* (- 1.0 ux) maxCos) ux)))))
yi))
(* (* (* (- 1.0 ux) maxCos) ux) zi)))(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (sqrt (* 2.0 PI))))
(fma
ux
(* (- zi (* ux zi)) maxCos)
(*
(sqrt
(fma (- 1.0 ux) (* (* ux (* maxCos (* ux maxCos))) (+ ux -1.0)) 1.0))
(fma (cos (* uy (* 2.0 PI))) xi (* (sin (* t_0 (* uy t_0))) yi))))))float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return (((cosf(((uy * 2.0f) * ((float) M_PI))) * sqrtf((1.0f - ((((1.0f - ux) * maxCos) * ux) * (((1.0f - ux) * maxCos) * ux))))) * xi) + ((sinf(((uy * 2.0f) * ((float) M_PI))) * sqrtf((1.0f - ((((1.0f - ux) * maxCos) * ux) * (((1.0f - ux) * maxCos) * ux))))) * yi)) + ((((1.0f - ux) * maxCos) * ux) * zi);
}
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = sqrtf((2.0f * ((float) M_PI)));
return fmaf(ux, ((zi - (ux * zi)) * maxCos), (sqrtf(fmaf((1.0f - ux), ((ux * (maxCos * (ux * maxCos))) * (ux + -1.0f)), 1.0f)) * fmaf(cosf((uy * (2.0f * ((float) M_PI)))), xi, (sinf((t_0 * (uy * t_0))) * yi))));
}
function code(xi, yi, zi, ux, uy, maxCos) return Float32(Float32(Float32(Float32(cos(Float32(Float32(uy * Float32(2.0)) * Float32(pi))) * sqrt(Float32(Float32(1.0) - Float32(Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) * Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux))))) * xi) + Float32(Float32(sin(Float32(Float32(uy * Float32(2.0)) * Float32(pi))) * sqrt(Float32(Float32(1.0) - Float32(Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) * Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux))))) * yi)) + Float32(Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) * zi)) end
function code(xi, yi, zi, ux, uy, maxCos) t_0 = sqrt(Float32(Float32(2.0) * Float32(pi))) return fma(ux, Float32(Float32(zi - Float32(ux * zi)) * maxCos), Float32(sqrt(fma(Float32(Float32(1.0) - ux), Float32(Float32(ux * Float32(maxCos * Float32(ux * maxCos))) * Float32(ux + Float32(-1.0))), Float32(1.0))) * fma(cos(Float32(uy * Float32(Float32(2.0) * Float32(pi)))), xi, Float32(sin(Float32(t_0 * Float32(uy * t_0))) * yi)))) end
\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right) \cdot \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right)}\right) \cdot xi + \left(\sin \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right) \cdot \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right)}\right) \cdot yi\right) + \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right) \cdot zi
\begin{array}{l}
t_0 := \sqrt{2 \cdot \pi}\\
\mathsf{fma}\left(ux, \left(zi - ux \cdot zi\right) \cdot maxCos, \sqrt{\mathsf{fma}\left(1 - ux, \left(ux \cdot \left(maxCos \cdot \left(ux \cdot maxCos\right)\right)\right) \cdot \left(ux + -1\right), 1\right)} \cdot \mathsf{fma}\left(\cos \left(uy \cdot \left(2 \cdot \pi\right)\right), xi, \sin \left(t_0 \cdot \left(uy \cdot t_0\right)\right) \cdot yi\right)\right)
\end{array}



Bits error versus xi



Bits error versus yi



Bits error versus zi



Bits error versus ux



Bits error versus uy



Bits error versus maxCos
Initial program 0.3
Simplified0.3
Taylor expanded in maxCos around 0 0.3
Applied egg-rr0.3
Applied egg-rr0.3
Final simplification0.3
herbie shell --seed 2022153
(FPCore (xi yi zi ux uy maxCos)
:name "UniformSampleCone 2"
:precision binary32
:pre (and (and (and (and (and (and (<= -10000.0 xi) (<= xi 10000.0)) (and (<= -10000.0 yi) (<= yi 10000.0))) (and (<= -10000.0 zi) (<= zi 10000.0))) (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) maxCos) ux) (* (* (- 1.0 ux) maxCos) ux))))) xi) (* (* (sin (* (* uy 2.0) PI)) (sqrt (- 1.0 (* (* (* (- 1.0 ux) maxCos) ux) (* (* (- 1.0 ux) maxCos) ux))))) yi)) (* (* (* (- 1.0 ux) maxCos) ux) zi)))