\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}}}\frac{1}{\sqrt{1 + \frac{\frac{u0}{\frac{\frac{1}{\sqrt{1 + \frac{\tan \left(\left(2 \cdot u1 + 0.5\right) \cdot \pi\right) \cdot alphay}{alphax} \cdot \frac{\tan \left(\left(2 \cdot u1 + 0.5\right) \cdot \pi\right) \cdot alphay}{alphax}}} \cdot \frac{1}{\sqrt{1 + \frac{\tan \left(\left(2 \cdot u1 + 0.5\right) \cdot \pi\right) \cdot alphay}{alphax} \cdot \frac{\tan \left(\left(2 \cdot u1 + 0.5\right) \cdot \pi\right) \cdot alphay}{alphax}}}}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\tan \left(\left(2 \cdot u1 + 0.5\right) \cdot \pi\right) \cdot \frac{alphay}{alphax}\right) \cdot \sin \tan^{-1} \left(\tan \left(\left(2 \cdot u1 + 0.5\right) \cdot \pi\right) \cdot \frac{alphay}{alphax}\right)}{alphay \cdot alphay}}}{1 - u0}}}(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
(/
1.0
(sqrt
(+
1.0
(/
(/
u0
(+
(/
(*
(/
1.0
(sqrt
(+
1.0
(*
(/ (* (tan (* (+ (* 2.0 u1) 0.5) PI)) alphay) alphax)
(/ (* (tan (* (+ (* 2.0 u1) 0.5) PI)) alphay) alphax)))))
(/
1.0
(sqrt
(+
1.0
(*
(/ (* (tan (* (+ (* 2.0 u1) 0.5) PI)) alphay) alphax)
(/ (* (tan (* (+ (* 2.0 u1) 0.5) PI)) alphay) alphax))))))
(* alphax alphax))
(/
(*
(sin (atan (* (tan (* (+ (* 2.0 u1) 0.5) PI)) (/ alphay alphax))))
(sin (atan (* (tan (* (+ (* 2.0 u1) 0.5) PI)) (/ alphay alphax)))))
(* 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) {
return 1.0f / sqrtf(1.0f + ((u0 / ((((1.0f / sqrtf(1.0f + (((tanf(((2.0f * u1) + 0.5f) * ((float) M_PI)) * alphay) / alphax) * ((tanf(((2.0f * u1) + 0.5f) * ((float) M_PI)) * alphay) / alphax)))) * (1.0f / sqrtf(1.0f + (((tanf(((2.0f * u1) + 0.5f) * ((float) M_PI)) * alphay) / alphax) * ((tanf(((2.0f * u1) + 0.5f) * ((float) M_PI)) * alphay) / alphax))))) / (alphax * alphax)) + ((sinf(atanf(tanf(((2.0f * u1) + 0.5f) * ((float) M_PI)) * (alphay / alphax))) * sinf(atanf(tanf(((2.0f * u1) + 0.5f) * ((float) M_PI)) * (alphay / alphax)))) / (alphay * alphay)))) / (1.0f - u0)));
}



Bits error versus u0



Bits error versus u1



Bits error versus alphax



Bits error versus alphay
Results
Initial program 0.2
Simplified0.2
rmApplied cos-atan_binary320.2
Simplified0.2
rmApplied cos-atan_binary320.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2021175
(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))))))