
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (/ (* (exp (- (/ (* sinTheta_i sinTheta_O) v))) (/ (* cosTheta_i cosTheta_O) v)) (* (* (sinh (/ 1.0 v)) 2.0) v)))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return (expf(-((sinTheta_i * sinTheta_O) / v)) * ((cosTheta_i * cosTheta_O) / v)) / ((sinhf((1.0f / v)) * 2.0f) * v);
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = (exp(-((sintheta_i * sintheta_o) / v)) * ((costheta_i * costheta_o) / v)) / ((sinh((1.0e0 / v)) * 2.0e0) * v)
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(exp(Float32(-Float32(Float32(sinTheta_i * sinTheta_O) / v))) * Float32(Float32(cosTheta_i * cosTheta_O) / v)) / Float32(Float32(sinh(Float32(Float32(1.0) / v)) * Float32(2.0)) * v)) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = (exp(-((sinTheta_i * sinTheta_O) / v)) * ((cosTheta_i * cosTheta_O) / v)) / ((sinh((single(1.0) / v)) * single(2.0)) * v); end
\begin{array}{l}
\\
\frac{e^{-\frac{sinTheta\_i \cdot sinTheta\_O}{v}} \cdot \frac{cosTheta\_i \cdot cosTheta\_O}{v}}{\left(\sinh \left(\frac{1}{v}\right) \cdot 2\right) \cdot v}
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 15 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (/ (* (exp (- (/ (* sinTheta_i sinTheta_O) v))) (/ (* cosTheta_i cosTheta_O) v)) (* (* (sinh (/ 1.0 v)) 2.0) v)))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return (expf(-((sinTheta_i * sinTheta_O) / v)) * ((cosTheta_i * cosTheta_O) / v)) / ((sinhf((1.0f / v)) * 2.0f) * v);
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = (exp(-((sintheta_i * sintheta_o) / v)) * ((costheta_i * costheta_o) / v)) / ((sinh((1.0e0 / v)) * 2.0e0) * v)
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(exp(Float32(-Float32(Float32(sinTheta_i * sinTheta_O) / v))) * Float32(Float32(cosTheta_i * cosTheta_O) / v)) / Float32(Float32(sinh(Float32(Float32(1.0) / v)) * Float32(2.0)) * v)) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = (exp(-((sinTheta_i * sinTheta_O) / v)) * ((cosTheta_i * cosTheta_O) / v)) / ((sinh((single(1.0) / v)) * single(2.0)) * v); end
\begin{array}{l}
\\
\frac{e^{-\frac{sinTheta\_i \cdot sinTheta\_O}{v}} \cdot \frac{cosTheta\_i \cdot cosTheta\_O}{v}}{\left(\sinh \left(\frac{1}{v}\right) \cdot 2\right) \cdot v}
\end{array}
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (/ (* (exp (- (/ (* sinTheta_i sinTheta_O) v))) (/ (* cosTheta_i cosTheta_O) v)) (* v (- (exp (/ 1.0 v)) (exp (/ -1.0 v))))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return (expf(-((sinTheta_i * sinTheta_O) / v)) * ((cosTheta_i * cosTheta_O) / v)) / (v * (expf((1.0f / v)) - expf((-1.0f / v))));
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = (exp(-((sintheta_i * sintheta_o) / v)) * ((costheta_i * costheta_o) / v)) / (v * (exp((1.0e0 / v)) - exp(((-1.0e0) / v))))
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(exp(Float32(-Float32(Float32(sinTheta_i * sinTheta_O) / v))) * Float32(Float32(cosTheta_i * cosTheta_O) / v)) / Float32(v * Float32(exp(Float32(Float32(1.0) / v)) - exp(Float32(Float32(-1.0) / v))))) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = (exp(-((sinTheta_i * sinTheta_O) / v)) * ((cosTheta_i * cosTheta_O) / v)) / (v * (exp((single(1.0) / v)) - exp((single(-1.0) / v)))); end
\begin{array}{l}
\\
\frac{e^{-\frac{sinTheta\_i \cdot sinTheta\_O}{v}} \cdot \frac{cosTheta\_i \cdot cosTheta\_O}{v}}{v \cdot \left(e^{\frac{1}{v}} - e^{\frac{-1}{v}}\right)}
\end{array}
Initial program 98.5%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.5
Simplified98.5%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (/ (/ (* cosTheta_i cosTheta_O) v) (* v (- (exp (/ 1.0 v)) (exp (/ -1.0 v))))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return ((cosTheta_i * cosTheta_O) / v) / (v * (expf((1.0f / v)) - expf((-1.0f / v))));
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = ((costheta_i * costheta_o) / v) / (v * (exp((1.0e0 / v)) - exp(((-1.0e0) / v))))
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(Float32(cosTheta_i * cosTheta_O) / v) / Float32(v * Float32(exp(Float32(Float32(1.0) / v)) - exp(Float32(Float32(-1.0) / v))))) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = ((cosTheta_i * cosTheta_O) / v) / (v * (exp((single(1.0) / v)) - exp((single(-1.0) / v)))); end
\begin{array}{l}
\\
\frac{\frac{cosTheta\_i \cdot cosTheta\_O}{v}}{v \cdot \left(e^{\frac{1}{v}} - e^{\frac{-1}{v}}\right)}
\end{array}
Initial program 98.5%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.5
Simplified98.5%
Taylor expanded in sinTheta_i around 0
Simplified98.5%
Final simplification98.5%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v)
:precision binary32
(if (<= v 0.26499998569488525)
(/ (/ (* cosTheta_i cosTheta_O) v) (* v (+ (exp (/ 1.0 v)) -1.0)))
(/
(* cosTheta_i (/ cosTheta_O v))
(*
v
(/
(+
(+ 2.0 (/ 0.3333333333333333 (* v v)))
(/
(+ 0.016666666666666666 (/ 0.0003968253968253968 (* v v)))
(pow v 4.0)))
v)))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
float tmp;
if (v <= 0.26499998569488525f) {
tmp = ((cosTheta_i * cosTheta_O) / v) / (v * (expf((1.0f / v)) + -1.0f));
} else {
tmp = (cosTheta_i * (cosTheta_O / v)) / (v * (((2.0f + (0.3333333333333333f / (v * v))) + ((0.016666666666666666f + (0.0003968253968253968f / (v * v))) / powf(v, 4.0f))) / v));
}
return tmp;
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
real(4) :: tmp
if (v <= 0.26499998569488525e0) then
tmp = ((costheta_i * costheta_o) / v) / (v * (exp((1.0e0 / v)) + (-1.0e0)))
else
tmp = (costheta_i * (costheta_o / v)) / (v * (((2.0e0 + (0.3333333333333333e0 / (v * v))) + ((0.016666666666666666e0 + (0.0003968253968253968e0 / (v * v))) / (v ** 4.0e0))) / v))
end if
code = tmp
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = Float32(0.0) if (v <= Float32(0.26499998569488525)) tmp = Float32(Float32(Float32(cosTheta_i * cosTheta_O) / v) / Float32(v * Float32(exp(Float32(Float32(1.0) / v)) + Float32(-1.0)))); else tmp = Float32(Float32(cosTheta_i * Float32(cosTheta_O / v)) / Float32(v * Float32(Float32(Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))) + Float32(Float32(Float32(0.016666666666666666) + Float32(Float32(0.0003968253968253968) / Float32(v * v))) / (v ^ Float32(4.0)))) / v))); end return tmp end
function tmp_2 = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = single(0.0); if (v <= single(0.26499998569488525)) tmp = ((cosTheta_i * cosTheta_O) / v) / (v * (exp((single(1.0) / v)) + single(-1.0))); else tmp = (cosTheta_i * (cosTheta_O / v)) / (v * (((single(2.0) + (single(0.3333333333333333) / (v * v))) + ((single(0.016666666666666666) + (single(0.0003968253968253968) / (v * v))) / (v ^ single(4.0)))) / v)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;v \leq 0.26499998569488525:\\
\;\;\;\;\frac{\frac{cosTheta\_i \cdot cosTheta\_O}{v}}{v \cdot \left(e^{\frac{1}{v}} + -1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{cosTheta\_i \cdot \frac{cosTheta\_O}{v}}{v \cdot \frac{\left(2 + \frac{0.3333333333333333}{v \cdot v}\right) + \frac{0.016666666666666666 + \frac{0.0003968253968253968}{v \cdot v}}{{v}^{4}}}{v}}\\
\end{array}
\end{array}
if v < 0.264999986Initial program 98.1%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.2
Simplified98.2%
Taylor expanded in sinTheta_i around 0
Simplified98.2%
Taylor expanded in v around inf
Simplified76.7%
if 0.264999986 < v Initial program 98.7%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.7
Simplified98.7%
Taylor expanded in sinTheta_i around 0
Simplified98.7%
Taylor expanded in v around -inf
mul-1-negN/A
distribute-frac-negN/A
sub-negN/A
mul-1-negN/A
distribute-neg-outN/A
remove-double-negN/A
lower-/.f32N/A
Simplified82.5%
Taylor expanded in cosTheta_i around 0
*-commutativeN/A
associate-/l*N/A
lower-*.f32N/A
lower-/.f3282.5
Simplified82.5%
Final simplification80.6%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v)
:precision binary32
(let* ((t_0 (/ (* cosTheta_i cosTheta_O) v)))
(if (<= v 0.26499998569488525)
(/ t_0 (* v (+ (exp (/ 1.0 v)) -1.0)))
(/
t_0
(*
v
(/
(+
(+ 2.0 (/ 0.3333333333333333 (* v v)))
(/
(fma v (* v 0.016666666666666666) 0.0003968253968253968)
(pow v 6.0)))
v))))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
float t_0 = (cosTheta_i * cosTheta_O) / v;
float tmp;
if (v <= 0.26499998569488525f) {
tmp = t_0 / (v * (expf((1.0f / v)) + -1.0f));
} else {
tmp = t_0 / (v * (((2.0f + (0.3333333333333333f / (v * v))) + (fmaf(v, (v * 0.016666666666666666f), 0.0003968253968253968f) / powf(v, 6.0f))) / v));
}
return tmp;
}
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) t_0 = Float32(Float32(cosTheta_i * cosTheta_O) / v) tmp = Float32(0.0) if (v <= Float32(0.26499998569488525)) tmp = Float32(t_0 / Float32(v * Float32(exp(Float32(Float32(1.0) / v)) + Float32(-1.0)))); else tmp = Float32(t_0 / Float32(v * Float32(Float32(Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))) + Float32(fma(v, Float32(v * Float32(0.016666666666666666)), Float32(0.0003968253968253968)) / (v ^ Float32(6.0)))) / v))); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{cosTheta\_i \cdot cosTheta\_O}{v}\\
\mathbf{if}\;v \leq 0.26499998569488525:\\
\;\;\;\;\frac{t\_0}{v \cdot \left(e^{\frac{1}{v}} + -1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{t\_0}{v \cdot \frac{\left(2 + \frac{0.3333333333333333}{v \cdot v}\right) + \frac{\mathsf{fma}\left(v, v \cdot 0.016666666666666666, 0.0003968253968253968\right)}{{v}^{6}}}{v}}\\
\end{array}
\end{array}
if v < 0.264999986Initial program 98.1%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.2
Simplified98.2%
Taylor expanded in sinTheta_i around 0
Simplified98.2%
Taylor expanded in v around inf
Simplified76.7%
if 0.264999986 < v Initial program 98.7%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.7
Simplified98.7%
Taylor expanded in sinTheta_i around 0
Simplified98.7%
Taylor expanded in v around -inf
mul-1-negN/A
distribute-frac-negN/A
sub-negN/A
mul-1-negN/A
distribute-neg-outN/A
remove-double-negN/A
lower-/.f32N/A
Simplified82.5%
Taylor expanded in v around 0
lower-/.f32N/A
+-commutativeN/A
*-commutativeN/A
unpow2N/A
associate-*l*N/A
lower-fma.f32N/A
lower-*.f32N/A
lower-pow.f3282.5
Simplified82.5%
Final simplification80.6%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v)
:precision binary32
(let* ((t_0 (/ (* cosTheta_i cosTheta_O) v)))
(if (<= v 0.26499998569488525)
(/ t_0 (* v (+ (exp (/ 1.0 v)) -1.0)))
(/
t_0
(*
v
(/
(+
(+ 2.0 (/ 0.3333333333333333 (* v v)))
(/
(+ 0.016666666666666666 (/ 0.0003968253968253968 (* v v)))
(* (* v v) (* v v))))
v))))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
float t_0 = (cosTheta_i * cosTheta_O) / v;
float tmp;
if (v <= 0.26499998569488525f) {
tmp = t_0 / (v * (expf((1.0f / v)) + -1.0f));
} else {
tmp = t_0 / (v * (((2.0f + (0.3333333333333333f / (v * v))) + ((0.016666666666666666f + (0.0003968253968253968f / (v * v))) / ((v * v) * (v * v)))) / v));
}
return tmp;
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
real(4) :: t_0
real(4) :: tmp
t_0 = (costheta_i * costheta_o) / v
if (v <= 0.26499998569488525e0) then
tmp = t_0 / (v * (exp((1.0e0 / v)) + (-1.0e0)))
else
tmp = t_0 / (v * (((2.0e0 + (0.3333333333333333e0 / (v * v))) + ((0.016666666666666666e0 + (0.0003968253968253968e0 / (v * v))) / ((v * v) * (v * v)))) / v))
end if
code = tmp
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) t_0 = Float32(Float32(cosTheta_i * cosTheta_O) / v) tmp = Float32(0.0) if (v <= Float32(0.26499998569488525)) tmp = Float32(t_0 / Float32(v * Float32(exp(Float32(Float32(1.0) / v)) + Float32(-1.0)))); else tmp = Float32(t_0 / Float32(v * Float32(Float32(Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))) + Float32(Float32(Float32(0.016666666666666666) + Float32(Float32(0.0003968253968253968) / Float32(v * v))) / Float32(Float32(v * v) * Float32(v * v)))) / v))); end return tmp end
function tmp_2 = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) t_0 = (cosTheta_i * cosTheta_O) / v; tmp = single(0.0); if (v <= single(0.26499998569488525)) tmp = t_0 / (v * (exp((single(1.0) / v)) + single(-1.0))); else tmp = t_0 / (v * (((single(2.0) + (single(0.3333333333333333) / (v * v))) + ((single(0.016666666666666666) + (single(0.0003968253968253968) / (v * v))) / ((v * v) * (v * v)))) / v)); end tmp_2 = tmp; end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{cosTheta\_i \cdot cosTheta\_O}{v}\\
\mathbf{if}\;v \leq 0.26499998569488525:\\
\;\;\;\;\frac{t\_0}{v \cdot \left(e^{\frac{1}{v}} + -1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{t\_0}{v \cdot \frac{\left(2 + \frac{0.3333333333333333}{v \cdot v}\right) + \frac{0.016666666666666666 + \frac{0.0003968253968253968}{v \cdot v}}{\left(v \cdot v\right) \cdot \left(v \cdot v\right)}}{v}}\\
\end{array}
\end{array}
if v < 0.264999986Initial program 98.1%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.2
Simplified98.2%
Taylor expanded in sinTheta_i around 0
Simplified98.2%
Taylor expanded in v around inf
Simplified76.7%
if 0.264999986 < v Initial program 98.7%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.7
Simplified98.7%
Taylor expanded in sinTheta_i around 0
Simplified98.7%
Taylor expanded in v around -inf
mul-1-negN/A
distribute-frac-negN/A
sub-negN/A
mul-1-negN/A
distribute-neg-outN/A
remove-double-negN/A
lower-/.f32N/A
Simplified82.5%
Taylor expanded in v around -inf
associate-*r/N/A
mul-1-negN/A
sub-negN/A
mul-1-negN/A
distribute-neg-outN/A
remove-double-negN/A
lower-/.f32N/A
Simplified82.5%
Final simplification80.6%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v)
:precision binary32
(/
(/ (* cosTheta_i cosTheta_O) v)
(*
v
(/
(+
(+ 2.0 (/ 0.3333333333333333 (* v v)))
(/
(+ 0.016666666666666666 (/ 0.0003968253968253968 (* v v)))
(* (* v v) (* v v))))
v))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return ((cosTheta_i * cosTheta_O) / v) / (v * (((2.0f + (0.3333333333333333f / (v * v))) + ((0.016666666666666666f + (0.0003968253968253968f / (v * v))) / ((v * v) * (v * v)))) / v));
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = ((costheta_i * costheta_o) / v) / (v * (((2.0e0 + (0.3333333333333333e0 / (v * v))) + ((0.016666666666666666e0 + (0.0003968253968253968e0 / (v * v))) / ((v * v) * (v * v)))) / v))
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(Float32(cosTheta_i * cosTheta_O) / v) / Float32(v * Float32(Float32(Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))) + Float32(Float32(Float32(0.016666666666666666) + Float32(Float32(0.0003968253968253968) / Float32(v * v))) / Float32(Float32(v * v) * Float32(v * v)))) / v))) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = ((cosTheta_i * cosTheta_O) / v) / (v * (((single(2.0) + (single(0.3333333333333333) / (v * v))) + ((single(0.016666666666666666) + (single(0.0003968253968253968) / (v * v))) / ((v * v) * (v * v)))) / v)); end
\begin{array}{l}
\\
\frac{\frac{cosTheta\_i \cdot cosTheta\_O}{v}}{v \cdot \frac{\left(2 + \frac{0.3333333333333333}{v \cdot v}\right) + \frac{0.016666666666666666 + \frac{0.0003968253968253968}{v \cdot v}}{\left(v \cdot v\right) \cdot \left(v \cdot v\right)}}{v}}
\end{array}
Initial program 98.5%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.5
Simplified98.5%
Taylor expanded in sinTheta_i around 0
Simplified98.5%
Taylor expanded in v around -inf
mul-1-negN/A
distribute-frac-negN/A
sub-negN/A
mul-1-negN/A
distribute-neg-outN/A
remove-double-negN/A
lower-/.f32N/A
Simplified76.6%
Taylor expanded in v around -inf
associate-*r/N/A
mul-1-negN/A
sub-negN/A
mul-1-negN/A
distribute-neg-outN/A
remove-double-negN/A
lower-/.f32N/A
Simplified76.6%
Final simplification76.6%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v)
:precision binary32
(/
(/ (* cosTheta_i cosTheta_O) v)
(*
v
(/
(+
(+ 2.0 (/ 0.3333333333333333 (* v v)))
(/ 0.016666666666666666 (* (* v v) (* v v))))
v))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return ((cosTheta_i * cosTheta_O) / v) / (v * (((2.0f + (0.3333333333333333f / (v * v))) + (0.016666666666666666f / ((v * v) * (v * v)))) / v));
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = ((costheta_i * costheta_o) / v) / (v * (((2.0e0 + (0.3333333333333333e0 / (v * v))) + (0.016666666666666666e0 / ((v * v) * (v * v)))) / v))
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(Float32(cosTheta_i * cosTheta_O) / v) / Float32(v * Float32(Float32(Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))) + Float32(Float32(0.016666666666666666) / Float32(Float32(v * v) * Float32(v * v)))) / v))) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = ((cosTheta_i * cosTheta_O) / v) / (v * (((single(2.0) + (single(0.3333333333333333) / (v * v))) + (single(0.016666666666666666) / ((v * v) * (v * v)))) / v)); end
\begin{array}{l}
\\
\frac{\frac{cosTheta\_i \cdot cosTheta\_O}{v}}{v \cdot \frac{\left(2 + \frac{0.3333333333333333}{v \cdot v}\right) + \frac{0.016666666666666666}{\left(v \cdot v\right) \cdot \left(v \cdot v\right)}}{v}}
\end{array}
Initial program 98.5%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.5
Simplified98.5%
Taylor expanded in sinTheta_i around 0
Simplified98.5%
Taylor expanded in v around -inf
mul-1-negN/A
distribute-frac-negN/A
sub-negN/A
mul-1-negN/A
distribute-neg-outN/A
remove-double-negN/A
lower-/.f32N/A
Simplified76.6%
Taylor expanded in v around inf
lower-/.f32N/A
metadata-evalN/A
pow-sqrN/A
lower-*.f32N/A
unpow2N/A
lower-*.f32N/A
unpow2N/A
lower-*.f3270.0
Simplified70.0%
Final simplification70.0%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v)
:precision binary32
(*
sinTheta_O
(fma
cosTheta_O
(* cosTheta_i (/ (- sinTheta_i) (fma 2.0 (* v v) 0.3333333333333333)))
(/
(* cosTheta_i cosTheta_O)
(* (+ 2.0 (/ 0.3333333333333333 (* v v))) (* sinTheta_O v))))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return sinTheta_O * fmaf(cosTheta_O, (cosTheta_i * (-sinTheta_i / fmaf(2.0f, (v * v), 0.3333333333333333f))), ((cosTheta_i * cosTheta_O) / ((2.0f + (0.3333333333333333f / (v * v))) * (sinTheta_O * v))));
}
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(sinTheta_O * fma(cosTheta_O, Float32(cosTheta_i * Float32(Float32(-sinTheta_i) / fma(Float32(2.0), Float32(v * v), Float32(0.3333333333333333)))), Float32(Float32(cosTheta_i * cosTheta_O) / Float32(Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))) * Float32(sinTheta_O * v))))) end
\begin{array}{l}
\\
sinTheta\_O \cdot \mathsf{fma}\left(cosTheta\_O, cosTheta\_i \cdot \frac{-sinTheta\_i}{\mathsf{fma}\left(2, v \cdot v, 0.3333333333333333\right)}, \frac{cosTheta\_i \cdot cosTheta\_O}{\left(2 + \frac{0.3333333333333333}{v \cdot v}\right) \cdot \left(sinTheta\_O \cdot v\right)}\right)
\end{array}
Initial program 98.5%
Taylor expanded in v around inf
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f3264.0
Simplified64.0%
Taylor expanded in sinTheta_i around 0
+-commutativeN/A
neg-mul-1N/A
associate-/l*N/A
distribute-rgt-neg-inN/A
mul-1-negN/A
lower-fma.f32N/A
mul-1-negN/A
distribute-neg-frac2N/A
lower-/.f32N/A
lower-neg.f3264.0
Simplified64.0%
Taylor expanded in sinTheta_O around inf
lower-*.f32N/A
mul-1-negN/A
associate-/l*N/A
distribute-rgt-neg-inN/A
lower-fma.f32N/A
Simplified64.0%
Final simplification64.0%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v)
:precision binary32
(/
(/ (* cosTheta_i cosTheta_O) v)
(*
v
(/
(+ 2.0 (/ (+ 0.3333333333333333 (/ 0.016666666666666666 (* v v))) (* v v)))
v))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return ((cosTheta_i * cosTheta_O) / v) / (v * ((2.0f + ((0.3333333333333333f + (0.016666666666666666f / (v * v))) / (v * v))) / v));
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = ((costheta_i * costheta_o) / v) / (v * ((2.0e0 + ((0.3333333333333333e0 + (0.016666666666666666e0 / (v * v))) / (v * v))) / v))
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(Float32(cosTheta_i * cosTheta_O) / v) / Float32(v * Float32(Float32(Float32(2.0) + Float32(Float32(Float32(0.3333333333333333) + Float32(Float32(0.016666666666666666) / Float32(v * v))) / Float32(v * v))) / v))) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = ((cosTheta_i * cosTheta_O) / v) / (v * ((single(2.0) + ((single(0.3333333333333333) + (single(0.016666666666666666) / (v * v))) / (v * v))) / v)); end
\begin{array}{l}
\\
\frac{\frac{cosTheta\_i \cdot cosTheta\_O}{v}}{v \cdot \frac{2 + \frac{0.3333333333333333 + \frac{0.016666666666666666}{v \cdot v}}{v \cdot v}}{v}}
\end{array}
Initial program 98.5%
Taylor expanded in v around 0
lower-*.f32N/A
lower--.f32N/A
lower-exp.f32N/A
lower-/.f32N/A
rec-expN/A
lower-exp.f32N/A
distribute-neg-fracN/A
metadata-evalN/A
lower-/.f3298.5
Simplified98.5%
Taylor expanded in sinTheta_i around 0
Simplified98.5%
Taylor expanded in v around -inf
associate-*r/N/A
mul-1-negN/A
sub-negN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower-/.f32N/A
Simplified70.0%
Final simplification70.0%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (* cosTheta_O (fma (* sinTheta_O (- sinTheta_i)) (/ cosTheta_i (fma 2.0 (* v v) 0.3333333333333333)) (/ cosTheta_i (* v (+ 2.0 (/ 0.3333333333333333 (* v v))))))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return cosTheta_O * fmaf((sinTheta_O * -sinTheta_i), (cosTheta_i / fmaf(2.0f, (v * v), 0.3333333333333333f)), (cosTheta_i / (v * (2.0f + (0.3333333333333333f / (v * v))))));
}
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(cosTheta_O * fma(Float32(sinTheta_O * Float32(-sinTheta_i)), Float32(cosTheta_i / fma(Float32(2.0), Float32(v * v), Float32(0.3333333333333333))), Float32(cosTheta_i / Float32(v * Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))))))) end
\begin{array}{l}
\\
cosTheta\_O \cdot \mathsf{fma}\left(sinTheta\_O \cdot \left(-sinTheta\_i\right), \frac{cosTheta\_i}{\mathsf{fma}\left(2, v \cdot v, 0.3333333333333333\right)}, \frac{cosTheta\_i}{v \cdot \left(2 + \frac{0.3333333333333333}{v \cdot v}\right)}\right)
\end{array}
Initial program 98.5%
Taylor expanded in v around inf
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f3264.0
Simplified64.0%
Taylor expanded in sinTheta_i around 0
mul-1-negN/A
associate-/l*N/A
distribute-rgt-neg-inN/A
associate-/l*N/A
distribute-lft-outN/A
lower-*.f32N/A
Simplified64.0%
Final simplification64.0%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (/ (* cosTheta_O (fma (* sinTheta_O (/ sinTheta_i v)) (- cosTheta_i) cosTheta_i)) (* v (+ 2.0 (/ 0.3333333333333333 (* v v))))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return (cosTheta_O * fmaf((sinTheta_O * (sinTheta_i / v)), -cosTheta_i, cosTheta_i)) / (v * (2.0f + (0.3333333333333333f / (v * v))));
}
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(cosTheta_O * fma(Float32(sinTheta_O * Float32(sinTheta_i / v)), Float32(-cosTheta_i), cosTheta_i)) / Float32(v * Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))))) end
\begin{array}{l}
\\
\frac{cosTheta\_O \cdot \mathsf{fma}\left(sinTheta\_O \cdot \frac{sinTheta\_i}{v}, -cosTheta\_i, cosTheta\_i\right)}{v \cdot \left(2 + \frac{0.3333333333333333}{v \cdot v}\right)}
\end{array}
Initial program 98.5%
Taylor expanded in v around inf
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f3264.0
Simplified64.0%
Taylor expanded in sinTheta_i around 0
+-commutativeN/A
neg-mul-1N/A
associate-/l*N/A
distribute-rgt-neg-inN/A
mul-1-negN/A
lower-fma.f32N/A
mul-1-negN/A
distribute-neg-frac2N/A
lower-/.f32N/A
lower-neg.f3264.0
Simplified64.0%
Taylor expanded in cosTheta_i around 0
lower-/.f32N/A
lower-*.f32N/A
+-commutativeN/A
distribute-rgt-inN/A
*-commutativeN/A
associate-*l*N/A
*-lft-identityN/A
lower-fma.f32N/A
associate-/l*N/A
lower-*.f32N/A
lower-/.f32N/A
neg-mul-1N/A
lower-neg.f32N/A
lower-*.f32N/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f3264.0
Simplified64.0%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (/ (* cosTheta_i cosTheta_O) (* v (+ 2.0 (/ 0.3333333333333333 (* v v))))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return (cosTheta_i * cosTheta_O) / (v * (2.0f + (0.3333333333333333f / (v * v))));
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = (costheta_i * costheta_o) / (v * (2.0e0 + (0.3333333333333333e0 / (v * v))))
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(cosTheta_i * cosTheta_O) / Float32(v * Float32(Float32(2.0) + Float32(Float32(0.3333333333333333) / Float32(v * v))))) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = (cosTheta_i * cosTheta_O) / (v * (single(2.0) + (single(0.3333333333333333) / (v * v)))); end
\begin{array}{l}
\\
\frac{cosTheta\_i \cdot cosTheta\_O}{v \cdot \left(2 + \frac{0.3333333333333333}{v \cdot v}\right)}
\end{array}
Initial program 98.5%
Taylor expanded in v around inf
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f3264.0
Simplified64.0%
Taylor expanded in sinTheta_i around 0
lower-/.f32N/A
lower-*.f32N/A
lower-*.f32N/A
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f3264.0
Simplified64.0%
Final simplification64.0%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (/ (* cosTheta_i (* cosTheta_O 0.5)) v))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return (cosTheta_i * (cosTheta_O * 0.5f)) / v;
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = (costheta_i * (costheta_o * 0.5e0)) / v
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(cosTheta_i * Float32(cosTheta_O * Float32(0.5))) / v) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = (cosTheta_i * (cosTheta_O * single(0.5))) / v; end
\begin{array}{l}
\\
\frac{cosTheta\_i \cdot \left(cosTheta\_O \cdot 0.5\right)}{v}
\end{array}
Initial program 98.5%
Taylor expanded in v around inf
Simplified58.3%
Taylor expanded in sinTheta_i around 0
Simplified58.3%
Taylor expanded in cosTheta_i around 0
associate-*r/N/A
lower-/.f32N/A
associate-*r*N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f3258.4
Simplified58.4%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (/ (* (* cosTheta_i cosTheta_O) 0.5) v))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return ((cosTheta_i * cosTheta_O) * 0.5f) / v;
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = ((costheta_i * costheta_o) * 0.5e0) / v
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(Float32(Float32(cosTheta_i * cosTheta_O) * Float32(0.5)) / v) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = ((cosTheta_i * cosTheta_O) * single(0.5)) / v; end
\begin{array}{l}
\\
\frac{\left(cosTheta\_i \cdot cosTheta\_O\right) \cdot 0.5}{v}
\end{array}
Initial program 98.5%
Taylor expanded in v around inf
Simplified58.3%
Taylor expanded in sinTheta_i around 0
associate-*r/N/A
lower-/.f32N/A
lower-*.f32N/A
lower-*.f3258.4
Simplified58.4%
Final simplification58.4%
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v) :precision binary32 (* v (* cosTheta_O (* cosTheta_i 3.0))))
float code(float cosTheta_i, float cosTheta_O, float sinTheta_i, float sinTheta_O, float v) {
return v * (cosTheta_O * (cosTheta_i * 3.0f));
}
real(4) function code(costheta_i, costheta_o, sintheta_i, sintheta_o, v)
real(4), intent (in) :: costheta_i
real(4), intent (in) :: costheta_o
real(4), intent (in) :: sintheta_i
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: v
code = v * (costheta_o * (costheta_i * 3.0e0))
end function
function code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) return Float32(v * Float32(cosTheta_O * Float32(cosTheta_i * Float32(3.0)))) end
function tmp = code(cosTheta_i, cosTheta_O, sinTheta_i, sinTheta_O, v) tmp = v * (cosTheta_O * (cosTheta_i * single(3.0))); end
\begin{array}{l}
\\
v \cdot \left(cosTheta\_O \cdot \left(cosTheta\_i \cdot 3\right)\right)
\end{array}
Initial program 98.5%
Taylor expanded in v around inf
lower-+.f32N/A
associate-*r/N/A
metadata-evalN/A
lower-/.f32N/A
unpow2N/A
lower-*.f3264.0
Simplified64.0%
Taylor expanded in sinTheta_i around 0
Simplified64.0%
Taylor expanded in v around 0
associate-*r*N/A
associate-*r*N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
associate-*l*N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f3256.7
Simplified56.7%
herbie shell --seed 2024215
(FPCore (cosTheta_i cosTheta_O sinTheta_i sinTheta_O v)
:name "HairBSDF, Mp, upper"
:precision binary32
:pre (and (and (and (and (and (and (<= -1.0 cosTheta_i) (<= cosTheta_i 1.0)) (and (<= -1.0 cosTheta_O) (<= cosTheta_O 1.0))) (and (<= -1.0 sinTheta_i) (<= sinTheta_i 1.0))) (and (<= -1.0 sinTheta_O) (<= sinTheta_O 1.0))) (< 0.1 v)) (<= v 1.5707964))
(/ (* (exp (- (/ (* sinTheta_i sinTheta_O) v))) (/ (* cosTheta_i cosTheta_O) v)) (* (* (sinh (/ 1.0 v)) 2.0) v)))