Average Error: 0.3 → 0.3
Time: 7.9s
Precision: binary32
\[\left(\left(\left(\left(\left(-10000 \leq xi \land xi \leq 10000\right) \land \left(-10000 \leq yi \land yi \leq 10000\right)\right) \land \left(-10000 \leq zi \land zi \leq 10000\right)\right) \land \left(2.328306437 \cdot 10^{-10} \leq ux \land ux \leq 1\right)\right) \land \left(2.328306437 \cdot 10^{-10} \leq uy \land uy \leq 1\right)\right) \land \left(0 \leq maxCos \land maxCos \leq 1\right)\]
\[\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(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \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, yi \cdot \sin \left(2 \cdot \left(uy \cdot \pi\right)\right)\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 (- 1.0 ux) (* (* ux (* maxCos (* ux maxCos))) (+ ux -1.0)) 1.0))
   (fma (cos (* uy (* 2.0 PI))) xi (* yi (sin (* 2.0 (* uy PI))))))))
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((1.0f - ux), ((ux * (maxCos * (ux * maxCos))) * (ux + -1.0f)), 1.0f)) * fmaf(cosf((uy * (2.0f * ((float) M_PI)))), xi, (yi * sinf((2.0f * (uy * ((float) M_PI))))))));
}
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)
	return fma(ux, Float32(Float32(Float32(1.0) - ux) * Float32(maxCos * zi)), 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(yi * sin(Float32(Float32(2.0) * Float32(uy * Float32(pi))))))))
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
\mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \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, yi \cdot \sin \left(2 \cdot \left(uy \cdot \pi\right)\right)\right)\right)

Error

Bits error versus xi

Bits error versus yi

Bits error versus zi

Bits error versus ux

Bits error versus uy

Bits error versus maxCos

Derivation

  1. Initial program 0.3

    \[\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 \]
  2. Simplified0.3

    \[\leadsto \color{blue}{\mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \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(uy \cdot \left(2 \cdot \pi\right)\right) \cdot yi\right)\right)} \]
  3. Applied egg-rr0.3

    \[\leadsto \mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \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, \color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\pi \cdot \left(uy \cdot 2\right)\right)\right)\right)} \cdot yi\right)\right) \]
  4. Taylor expanded in uy around inf 0.3

    \[\leadsto \mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \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, \color{blue}{\sin \left(2 \cdot \left(\pi \cdot uy\right)\right) \cdot yi}\right)\right) \]
  5. Simplified0.3

    \[\leadsto \mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \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, \color{blue}{yi \cdot \sin \left(2 \cdot \left(uy \cdot \pi\right)\right)}\right)\right) \]
  6. Final simplification0.3

    \[\leadsto \mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \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, yi \cdot \sin \left(2 \cdot \left(uy \cdot \pi\right)\right)\right)\right) \]

Reproduce

herbie shell --seed 2022160 
(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)))