\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
\mathsf{fma}\left(ux, \left(\left(1 - ux\right) \cdot maxCos\right) \cdot zi, \sqrt{\mathsf{fma}\left(ux, ux \cdot \left(\left(maxCos \cdot maxCos\right) \cdot \mathsf{fma}\left(2, ux, -1\right)\right), 1\right)} \cdot \mathsf{fma}\left(\cos \left(e^{\log \left(2 \cdot \left(uy \cdot \pi\right)\right)}\right), xi, \sin \left(\pi \cdot \left(2 \cdot uy\right)\right) \cdot yi\right)\right)
(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
(fma
ux
(* (* (- 1.0 ux) maxCos) zi)
(*
(sqrt (fma ux (* ux (* (* maxCos maxCos) (fma 2.0 ux -1.0))) 1.0))
(fma
(cos (exp (log (* 2.0 (* uy PI)))))
xi
(* (sin (* PI (* 2.0 uy))) 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) {
return fmaf(ux, (((1.0f - ux) * maxCos) * zi), (sqrtf(fmaf(ux, (ux * ((maxCos * maxCos) * fmaf(2.0f, ux, -1.0f))), 1.0f)) * fmaf(cosf(expf(logf(2.0f * (uy * ((float) M_PI))))), xi, (sinf(((float) M_PI) * (2.0f * uy)) * yi))));
}



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 ux around 0 0.4
Simplified0.4
Applied add-exp-log_binary320.4
Applied add-exp-log_binary320.4
Applied add-exp-log_binary320.4
Applied prod-exp_binary320.4
Applied prod-exp_binary320.4
Simplified0.4
Final simplification0.4
herbie shell --seed 2022024
(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)))