Average Error: 0.2 → 0.2
Time: 11.5s
Precision: binary32
\[2.328306437 \cdot 10^{-10} \leq u0 \land u0 \leq 1 \land 2.328306437 \cdot 10^{-10} \leq u1 \land u1 \leq 0.5 \land 0.0001 \leq alphax \land alphax \leq 1 \land 0.0001 \leq alphay \land alphay \leq 1\]
\[\frac{1}{\sqrt{1 + \frac{\frac{1}{\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphay \cdot alphay}} \cdot u0}{1 - u0}}} \]
\[\begin{array}{l} t_0 := \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right)\\ t_1 := \sin t_0\\ t_2 := \cos t_0\\ \frac{1}{\sqrt{1 + \frac{\frac{u0}{\frac{t_2 \cdot t_2}{alphax \cdot alphax} + \frac{t_1 \cdot t_1}{alphay \cdot alphay}}}{1 - u0}}} \end{array} \]
\frac{1}{\sqrt{1 + \frac{\frac{1}{\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphay \cdot alphay}} \cdot u0}{1 - u0}}}
\begin{array}{l}
t_0 := \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right)\\
t_1 := \sin t_0\\
t_2 := \cos t_0\\
\frac{1}{\sqrt{1 + \frac{\frac{u0}{\frac{t_2 \cdot t_2}{alphax \cdot alphax} + \frac{t_1 \cdot t_1}{alphay \cdot alphay}}}{1 - u0}}}
\end{array}
(FPCore (u0 u1 alphax alphay)
 :precision binary32
 (/
  1.0
  (sqrt
   (+
    1.0
    (/
     (*
      (/
       1.0
       (+
        (/
         (*
          (cos
           (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI))))))
          (cos
           (atan
            (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI)))))))
         (* alphax alphax))
        (/
         (*
          (sin
           (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI))))))
          (sin
           (atan
            (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI)))))))
         (* alphay alphay))))
      u0)
     (- 1.0 u0))))))
(FPCore (u0 u1 alphax alphay)
 :precision binary32
 (let* ((t_0 (atan (* (/ alphay alphax) (tan (* PI (+ 0.5 (* 2.0 u1)))))))
        (t_1 (sin t_0))
        (t_2 (cos t_0)))
   (/
    1.0
    (sqrt
     (+
      1.0
      (/
       (/
        u0
        (+
         (/ (* t_2 t_2) (* alphax alphax))
         (/ (* t_1 t_1) (* alphay alphay))))
       (- 1.0 u0)))))))
float code(float u0, float u1, float alphax, float alphay) {
	return 1.0f / sqrtf(1.0f + (((1.0f / (((cosf(atanf((alphay / alphax) * tanf(((2.0f * ((float) M_PI)) * u1) + (0.5f * ((float) M_PI))))) * cosf(atanf((alphay / alphax) * tanf(((2.0f * ((float) M_PI)) * u1) + (0.5f * ((float) M_PI)))))) / (alphax * alphax)) + ((sinf(atanf((alphay / alphax) * tanf(((2.0f * ((float) M_PI)) * u1) + (0.5f * ((float) M_PI))))) * sinf(atanf((alphay / alphax) * tanf(((2.0f * ((float) M_PI)) * u1) + (0.5f * ((float) M_PI)))))) / (alphay * alphay)))) * u0) / (1.0f - u0)));
}
float code(float u0, float u1, float alphax, float alphay) {
	float t_0 = atanf((alphay / alphax) * tanf(((float) M_PI) * (0.5f + (2.0f * u1))));
	float t_1 = sinf(t_0);
	float t_2 = cosf(t_0);
	return 1.0f / sqrtf(1.0f + ((u0 / (((t_2 * t_2) / (alphax * alphax)) + ((t_1 * t_1) / (alphay * alphay)))) / (1.0f - u0)));
}

Error

Bits error versus u0

Bits error versus u1

Bits error versus alphax

Bits error versus alphay

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Initial program 0.2

    \[\frac{1}{\sqrt{1 + \frac{\frac{1}{\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphay \cdot alphay}} \cdot u0}{1 - u0}}} \]
  2. Simplified0.2

    \[\leadsto \color{blue}{\frac{1}{\sqrt{1 + \frac{\frac{u0}{\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right) \cdot \cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right)}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right) \cdot \sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right)}{alphay \cdot alphay}}}{1 - u0}}}} \]
  3. Final simplification0.2

    \[\leadsto \frac{1}{\sqrt{1 + \frac{\frac{u0}{\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right) \cdot \cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right)}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right) \cdot \sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\pi \cdot \left(0.5 + 2 \cdot u1\right)\right)\right)}{alphay \cdot alphay}}}{1 - u0}}} \]

Reproduce

herbie shell --seed 2021206 
(FPCore (u0 u1 alphax alphay)
  :name "Trowbridge-Reitz Sample, sample surface normal, cosTheta"
  :precision binary32
  :pre (and (<= 2.328306437e-10 u0 1.0) (<= 2.328306437e-10 u1 0.5) (<= 0.0001 alphax 1.0) (<= 0.0001 alphay 1.0))
  (/ 1.0 (sqrt (+ 1.0 (/ (* (/ 1.0 (+ (/ (* (cos (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI)))))) (cos (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI))))))) (* alphax alphax)) (/ (* (sin (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI)))))) (sin (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI))))))) (* alphay alphay)))) u0) (- 1.0 u0))))))