\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\sqrt{1 - \left(ux \cdot \left(\left(1 - ux\right) \cdot maxCos\right)\right) \cdot \left(ux \cdot \left(\left(1 - ux\right) \cdot maxCos\right)\right)} \cdot \left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot xi + \sin \left(\sqrt[3]{\left(\left(uy \cdot 2\right) \cdot \left(\left(uy \cdot 2\right) \cdot \left(uy \cdot 2\right)\right)\right) \cdot \left(\pi \cdot \left(\pi \cdot \pi\right)\right)}\right) \cdot yi\right) + \left(ux \cdot \left(\left(1 - ux\right) \cdot maxCos\right)\right) \cdot zi(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
(+
(*
(sqrt (- 1.0 (* (* ux (* (- 1.0 ux) maxCos)) (* ux (* (- 1.0 ux) maxCos)))))
(+
(* (cos (* (* uy 2.0) PI)) xi)
(*
(sin (cbrt (* (* (* uy 2.0) (* (* uy 2.0) (* uy 2.0))) (* PI (* PI PI)))))
yi)))
(* (* ux (* (- 1.0 ux) maxCos)) zi)))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 (sqrtf(1.0f - ((ux * ((1.0f - ux) * maxCos)) * (ux * ((1.0f - ux) * maxCos)))) * ((cosf((uy * 2.0f) * ((float) M_PI)) * xi) + (sinf(cbrtf(((uy * 2.0f) * ((uy * 2.0f) * (uy * 2.0f))) * (((float) M_PI) * (((float) M_PI) * ((float) M_PI))))) * yi))) + ((ux * ((1.0f - ux) * maxCos)) * zi);
}



Bits error versus xi



Bits error versus yi



Bits error versus zi



Bits error versus ux



Bits error versus uy



Bits error versus maxCos
Results
Initial program 0.3
Simplified0.3
rmApplied add-cbrt-cube_binary320.3
Applied add-cbrt-cube_binary320.3
Applied cbrt-unprod_binary320.3
Final simplification0.3
herbie shell --seed 2021173
(FPCore (xi yi zi ux uy maxCos)
:name "UniformSampleCone 2"
:precision binary32
:pre (and (<= -10000.0 xi 10000.0) (<= -10000.0 yi 10000.0) (<= -10000.0 zi 10000.0) (<= 2.328306437e-10 ux 1.0) (<= 2.328306437e-10 uy 1.0) (<= 0.0 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)))