HairBSDF, sample_f, cosTheta

Percentage Accurate: 99.5% → 99.4%
Time: 11.0s
Alternatives: 9
Speedup: 1.0×

Specification

?
\[\left(10^{-5} \leq u \land u \leq 1\right) \land \left(0 \leq v \land v \leq 109.746574\right)\]
\[\begin{array}{l} \\ 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \end{array} \]
(FPCore (u v)
 :precision binary32
 (+ 1.0 (* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))))
float code(float u, float v) {
	return 1.0f + (v * logf((u + ((1.0f - u) * expf((-2.0f / v))))));
}
real(4) function code(u, v)
    real(4), intent (in) :: u
    real(4), intent (in) :: v
    code = 1.0e0 + (v * log((u + ((1.0e0 - u) * exp(((-2.0e0) / v))))))
end function
function code(u, v)
	return Float32(Float32(1.0) + Float32(v * log(Float32(u + Float32(Float32(Float32(1.0) - u) * exp(Float32(Float32(-2.0) / v)))))))
end
function tmp = code(u, v)
	tmp = single(1.0) + (v * log((u + ((single(1.0) - u) * exp((single(-2.0) / v))))));
end
\begin{array}{l}

\\
1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)
\end{array}

Sampling outcomes in binary32 precision:

Local Percentage Accuracy vs ?

The average percentage accuracy by input value. Horizontal axis shows value of an input variable; the variable is choosen in the title. Vertical axis is accuracy; higher is better. Red represent the original program, while blue represents Herbie's suggestion. These can be toggled with buttons below the plot. The line is an average while dots represent individual samples.

Accuracy vs Speed?

Herbie found 9 alternatives:

AlternativeAccuracySpeedup
The accuracy (vertical axis) and speed (horizontal axis) of each alternatives. Up and to the right is better. The red square shows the initial program, and each blue circle shows an alternative.The line shows the best available speed-accuracy tradeoffs.

Initial Program: 99.5% accurate, 1.0× speedup?

\[\begin{array}{l} \\ 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \end{array} \]
(FPCore (u v)
 :precision binary32
 (+ 1.0 (* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))))
float code(float u, float v) {
	return 1.0f + (v * logf((u + ((1.0f - u) * expf((-2.0f / v))))));
}
real(4) function code(u, v)
    real(4), intent (in) :: u
    real(4), intent (in) :: v
    code = 1.0e0 + (v * log((u + ((1.0e0 - u) * exp(((-2.0e0) / v))))))
end function
function code(u, v)
	return Float32(Float32(1.0) + Float32(v * log(Float32(u + Float32(Float32(Float32(1.0) - u) * exp(Float32(Float32(-2.0) / v)))))))
end
function tmp = code(u, v)
	tmp = single(1.0) + (v * log((u + ((single(1.0) - u) * exp((single(-2.0) / v))))));
end
\begin{array}{l}

\\
1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)
\end{array}

Alternative 1: 99.4% accurate, 0.7× speedup?

\[\begin{array}{l} \\ \begin{array}{l} t_0 := e^{\frac{-2}{v}}\\ 1 + v \cdot \log \left(\left(t\_0 + u\right) - t\_0 \cdot u\right) \end{array} \end{array} \]
(FPCore (u v)
 :precision binary32
 (let* ((t_0 (exp (/ -2.0 v)))) (+ 1.0 (* v (log (- (+ t_0 u) (* t_0 u)))))))
float code(float u, float v) {
	float t_0 = expf((-2.0f / v));
	return 1.0f + (v * logf(((t_0 + u) - (t_0 * u))));
}
real(4) function code(u, v)
    real(4), intent (in) :: u
    real(4), intent (in) :: v
    real(4) :: t_0
    t_0 = exp(((-2.0e0) / v))
    code = 1.0e0 + (v * log(((t_0 + u) - (t_0 * u))))
end function
function code(u, v)
	t_0 = exp(Float32(Float32(-2.0) / v))
	return Float32(Float32(1.0) + Float32(v * log(Float32(Float32(t_0 + u) - Float32(t_0 * u)))))
end
function tmp = code(u, v)
	t_0 = exp((single(-2.0) / v));
	tmp = single(1.0) + (v * log(((t_0 + u) - (t_0 * u))));
end
\begin{array}{l}

\\
\begin{array}{l}
t_0 := e^{\frac{-2}{v}}\\
1 + v \cdot \log \left(\left(t\_0 + u\right) - t\_0 \cdot u\right)
\end{array}
\end{array}
Derivation
  1. Initial program 99.6%

    \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
  2. Add Preprocessing
  3. Step-by-step derivation
    1. lift-+.f32N/A

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)} \]
    2. lift-*.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{\left(1 - u\right) \cdot e^{\frac{-2}{v}}}\right) \]
    3. *-commutativeN/A

      \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{e^{\frac{-2}{v}} \cdot \left(1 - u\right)}\right) \]
    4. lift--.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + e^{\frac{-2}{v}} \cdot \color{blue}{\left(1 - u\right)}\right) \]
    5. sub-negN/A

      \[\leadsto 1 + v \cdot \log \left(u + e^{\frac{-2}{v}} \cdot \color{blue}{\left(1 + \left(\mathsf{neg}\left(u\right)\right)\right)}\right) \]
    6. distribute-rgt-inN/A

      \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{\left(1 \cdot e^{\frac{-2}{v}} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)}\right) \]
    7. *-lft-identityN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(\color{blue}{e^{\frac{-2}{v}}} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)\right) \]
    8. associate-+r+N/A

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)} \]
    9. lower-+.f32N/A

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)} \]
    10. lower-+.f32N/A

      \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(u + e^{\frac{-2}{v}}\right)} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right) \]
    11. lower-*.f32N/A

      \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}}\right) \]
    12. lower-neg.f3299.6

      \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(-u\right)} \cdot e^{\frac{-2}{v}}\right) \]
  4. Applied rewrites99.6%

    \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(-u\right) \cdot e^{\frac{-2}{v}}\right)} \]
  5. Step-by-step derivation
    1. lift-+.f32N/A

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(-u\right) \cdot e^{\frac{-2}{v}}\right)} \]
    2. lift-*.f32N/A

      \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(-u\right) \cdot e^{\frac{-2}{v}}}\right) \]
    3. lift-neg.f32N/A

      \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(\mathsf{neg}\left(u\right)\right)} \cdot e^{\frac{-2}{v}}\right) \]
    4. distribute-lft-neg-outN/A

      \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(\mathsf{neg}\left(u \cdot e^{\frac{-2}{v}}\right)\right)}\right) \]
    5. unsub-negN/A

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) - u \cdot e^{\frac{-2}{v}}\right)} \]
    6. lower--.f32N/A

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) - u \cdot e^{\frac{-2}{v}}\right)} \]
    7. lift-+.f32N/A

      \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(u + e^{\frac{-2}{v}}\right)} - u \cdot e^{\frac{-2}{v}}\right) \]
    8. +-commutativeN/A

      \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(e^{\frac{-2}{v}} + u\right)} - u \cdot e^{\frac{-2}{v}}\right) \]
    9. lower-+.f32N/A

      \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(e^{\frac{-2}{v}} + u\right)} - u \cdot e^{\frac{-2}{v}}\right) \]
    10. *-commutativeN/A

      \[\leadsto 1 + v \cdot \log \left(\left(e^{\frac{-2}{v}} + u\right) - \color{blue}{e^{\frac{-2}{v}} \cdot u}\right) \]
    11. lower-*.f3299.6

      \[\leadsto 1 + v \cdot \log \left(\left(e^{\frac{-2}{v}} + u\right) - \color{blue}{e^{\frac{-2}{v}} \cdot u}\right) \]
  6. Applied rewrites99.6%

    \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(e^{\frac{-2}{v}} + u\right) - e^{\frac{-2}{v}} \cdot u\right)} \]
  7. Add Preprocessing

Alternative 2: 99.4% accurate, 0.7× speedup?

\[\begin{array}{l} \\ 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left(e^{3}\right)}^{\left(0.3333333333333333 \cdot \frac{-2}{v}\right)}\right) \end{array} \]
(FPCore (u v)
 :precision binary32
 (+
  1.0
  (*
   v
   (log
    (+ u (* (- 1.0 u) (pow (exp 3.0) (* 0.3333333333333333 (/ -2.0 v)))))))))
float code(float u, float v) {
	return 1.0f + (v * logf((u + ((1.0f - u) * powf(expf(3.0f), (0.3333333333333333f * (-2.0f / v)))))));
}
real(4) function code(u, v)
    real(4), intent (in) :: u
    real(4), intent (in) :: v
    code = 1.0e0 + (v * log((u + ((1.0e0 - u) * (exp(3.0e0) ** (0.3333333333333333e0 * ((-2.0e0) / v)))))))
end function
function code(u, v)
	return Float32(Float32(1.0) + Float32(v * log(Float32(u + Float32(Float32(Float32(1.0) - u) * (exp(Float32(3.0)) ^ Float32(Float32(0.3333333333333333) * Float32(Float32(-2.0) / v))))))))
end
function tmp = code(u, v)
	tmp = single(1.0) + (v * log((u + ((single(1.0) - u) * (exp(single(3.0)) ^ (single(0.3333333333333333) * (single(-2.0) / v)))))));
end
\begin{array}{l}

\\
1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left(e^{3}\right)}^{\left(0.3333333333333333 \cdot \frac{-2}{v}\right)}\right)
\end{array}
Derivation
  1. Initial program 99.6%

    \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
  2. Add Preprocessing
  3. Step-by-step derivation
    1. lift-exp.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{e^{\frac{-2}{v}}}\right) \]
    2. *-lft-identityN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\color{blue}{1 \cdot \frac{-2}{v}}}\right) \]
    3. exp-prodN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\left(e^{1}\right)}^{\left(\frac{-2}{v}\right)}}\right) \]
    4. lower-pow.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\left(e^{1}\right)}^{\left(\frac{-2}{v}\right)}}\right) \]
    5. exp-1-eN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\mathsf{E}\left(\right)}}^{\left(\frac{-2}{v}\right)}\right) \]
    6. lower-E.f3299.6

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\mathsf{E}\left(\right)}}^{\left(\frac{-2}{v}\right)}\right) \]
  4. Applied rewrites99.6%

    \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\mathsf{E}\left(\right)}^{\left(\frac{-2}{v}\right)}}\right) \]
  5. Step-by-step derivation
    1. lift-pow.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\mathsf{E}\left(\right)}^{\left(\frac{-2}{v}\right)}}\right) \]
    2. lift-E.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\mathsf{E}\left(\right)}}^{\left(\frac{-2}{v}\right)}\right) \]
    3. add-cbrt-cubeN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\left(\sqrt[3]{\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)}\right)}}^{\left(\frac{-2}{v}\right)}\right) \]
    4. pow1/3N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\left({\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\frac{1}{3}}\right)}}^{\left(\frac{-2}{v}\right)}\right) \]
    5. metadata-evalN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left({\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\color{blue}{\left(\frac{1}{3} \cdot 1\right)}}\right)}^{\left(\frac{-2}{v}\right)}\right) \]
    6. log-EN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left({\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\left(\frac{1}{3} \cdot \color{blue}{\log \mathsf{E}\left(\right)}\right)}\right)}^{\left(\frac{-2}{v}\right)}\right) \]
    7. lift-E.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left({\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\left(\frac{1}{3} \cdot \log \color{blue}{\mathsf{E}\left(\right)}\right)}\right)}^{\left(\frac{-2}{v}\right)}\right) \]
    8. log-powN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left({\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\color{blue}{\log \left({\mathsf{E}\left(\right)}^{\frac{1}{3}}\right)}}\right)}^{\left(\frac{-2}{v}\right)}\right) \]
    9. pow1/3N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left({\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\log \color{blue}{\left(\sqrt[3]{\mathsf{E}\left(\right)}\right)}}\right)}^{\left(\frac{-2}{v}\right)}\right) \]
    10. lift-E.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left({\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\log \left(\sqrt[3]{\color{blue}{\mathsf{E}\left(\right)}}\right)}\right)}^{\left(\frac{-2}{v}\right)}\right) \]
    11. pow-powN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}}\right) \]
    12. lower-pow.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\left(\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)\right)}^{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}}\right) \]
    13. rem-cube-cbrtN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\left({\left(\sqrt[3]{\left(\mathsf{E}\left(\right) \cdot \mathsf{E}\left(\right)\right) \cdot \mathsf{E}\left(\right)}\right)}^{3}\right)}}^{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}\right) \]
    14. add-cbrt-cubeN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left({\color{blue}{\mathsf{E}\left(\right)}}^{3}\right)}^{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}\right) \]
    15. e-exp-1N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left({\color{blue}{\left(e^{1}\right)}}^{3}\right)}^{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}\right) \]
    16. pow-expN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\left(e^{1 \cdot 3}\right)}}^{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}\right) \]
    17. metadata-evalN/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left(e^{\color{blue}{3}}\right)}^{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}\right) \]
    18. lower-exp.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\left(e^{3}\right)}}^{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}\right) \]
    19. lower-*.f32N/A

      \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\left(e^{3}\right)}^{\color{blue}{\left(\log \left(\sqrt[3]{\mathsf{E}\left(\right)}\right) \cdot \frac{-2}{v}\right)}}\right) \]
  6. Applied rewrites99.6%

    \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\left(e^{3}\right)}^{\left(0.3333333333333333 \cdot \frac{-2}{v}\right)}}\right) \]
  7. Add Preprocessing

Alternative 3: 47.5% accurate, 1.0× speedup?

\[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;v \leq 0.10000000149011612:\\ \;\;\;\;1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\frac{-2}{v}}, u\right)\right)\\ \mathbf{else}:\\ \;\;\;\;1 + \left(\left(1 - u\right) \cdot -2 + \left(\left(\left(\frac{4}{u} - 4\right) \cdot u\right) \cdot u\right) \cdot \frac{0.5}{v}\right)\\ \end{array} \end{array} \]
(FPCore (u v)
 :precision binary32
 (if (<= v 0.10000000149011612)
   (+ 1.0 (* v (log (fma (- u) (exp (/ -2.0 v)) u))))
   (+ 1.0 (+ (* (- 1.0 u) -2.0) (* (* (* (- (/ 4.0 u) 4.0) u) u) (/ 0.5 v))))))
float code(float u, float v) {
	float tmp;
	if (v <= 0.10000000149011612f) {
		tmp = 1.0f + (v * logf(fmaf(-u, expf((-2.0f / v)), u)));
	} else {
		tmp = 1.0f + (((1.0f - u) * -2.0f) + (((((4.0f / u) - 4.0f) * u) * u) * (0.5f / v)));
	}
	return tmp;
}
function code(u, v)
	tmp = Float32(0.0)
	if (v <= Float32(0.10000000149011612))
		tmp = Float32(Float32(1.0) + Float32(v * log(fma(Float32(-u), exp(Float32(Float32(-2.0) / v)), u))));
	else
		tmp = Float32(Float32(1.0) + Float32(Float32(Float32(Float32(1.0) - u) * Float32(-2.0)) + Float32(Float32(Float32(Float32(Float32(Float32(4.0) / u) - Float32(4.0)) * u) * u) * Float32(Float32(0.5) / v))));
	end
	return tmp
end
\begin{array}{l}

\\
\begin{array}{l}
\mathbf{if}\;v \leq 0.10000000149011612:\\
\;\;\;\;1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\frac{-2}{v}}, u\right)\right)\\

\mathbf{else}:\\
\;\;\;\;1 + \left(\left(1 - u\right) \cdot -2 + \left(\left(\left(\frac{4}{u} - 4\right) \cdot u\right) \cdot u\right) \cdot \frac{0.5}{v}\right)\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if v < 0.100000001

    1. Initial program 100.0%

      \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
    2. Add Preprocessing
    3. Step-by-step derivation
      1. lift-+.f32N/A

        \[\leadsto 1 + v \cdot \log \color{blue}{\left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)} \]
      2. lift-*.f32N/A

        \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{\left(1 - u\right) \cdot e^{\frac{-2}{v}}}\right) \]
      3. *-commutativeN/A

        \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{e^{\frac{-2}{v}} \cdot \left(1 - u\right)}\right) \]
      4. lift--.f32N/A

        \[\leadsto 1 + v \cdot \log \left(u + e^{\frac{-2}{v}} \cdot \color{blue}{\left(1 - u\right)}\right) \]
      5. sub-negN/A

        \[\leadsto 1 + v \cdot \log \left(u + e^{\frac{-2}{v}} \cdot \color{blue}{\left(1 + \left(\mathsf{neg}\left(u\right)\right)\right)}\right) \]
      6. distribute-rgt-inN/A

        \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{\left(1 \cdot e^{\frac{-2}{v}} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)}\right) \]
      7. *-lft-identityN/A

        \[\leadsto 1 + v \cdot \log \left(u + \left(\color{blue}{e^{\frac{-2}{v}}} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)\right) \]
      8. associate-+r+N/A

        \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)} \]
      9. lower-+.f32N/A

        \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)} \]
      10. lower-+.f32N/A

        \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(u + e^{\frac{-2}{v}}\right)} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right) \]
      11. lower-*.f32N/A

        \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}}\right) \]
      12. lower-neg.f32100.0

        \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(-u\right)} \cdot e^{\frac{-2}{v}}\right) \]
    4. Applied rewrites100.0%

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(-u\right) \cdot e^{\frac{-2}{v}}\right)} \]
    5. Taylor expanded in u around inf

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(u \cdot \left(1 + -1 \cdot e^{\frac{-2}{v}}\right)\right)} \]
    6. Step-by-step derivation
      1. +-commutativeN/A

        \[\leadsto 1 + v \cdot \log \left(u \cdot \color{blue}{\left(-1 \cdot e^{\frac{-2}{v}} + 1\right)}\right) \]
      2. distribute-lft-inN/A

        \[\leadsto 1 + v \cdot \log \color{blue}{\left(u \cdot \left(-1 \cdot e^{\frac{-2}{v}}\right) + u \cdot 1\right)} \]
      3. associate-*r*N/A

        \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(u \cdot -1\right) \cdot e^{\frac{-2}{v}}} + u \cdot 1\right) \]
      4. *-commutativeN/A

        \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(-1 \cdot u\right)} \cdot e^{\frac{-2}{v}} + u \cdot 1\right) \]
      5. *-rgt-identityN/A

        \[\leadsto 1 + v \cdot \log \left(\left(-1 \cdot u\right) \cdot e^{\frac{-2}{v}} + \color{blue}{u}\right) \]
      6. lower-fma.f32N/A

        \[\leadsto 1 + v \cdot \log \color{blue}{\left(\mathsf{fma}\left(-1 \cdot u, e^{\frac{-2}{v}}, u\right)\right)} \]
      7. mul-1-negN/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(\color{blue}{\mathsf{neg}\left(u\right)}, e^{\frac{-2}{v}}, u\right)\right) \]
      8. lower-neg.f32N/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(\color{blue}{-u}, e^{\frac{-2}{v}}, u\right)\right) \]
      9. metadata-evalN/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\frac{\color{blue}{\mathsf{neg}\left(2\right)}}{v}}, u\right)\right) \]
      10. distribute-neg-fracN/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\color{blue}{\mathsf{neg}\left(\frac{2}{v}\right)}}, u\right)\right) \]
      11. metadata-evalN/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\mathsf{neg}\left(\frac{\color{blue}{2 \cdot 1}}{v}\right)}, u\right)\right) \]
      12. associate-*r/N/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\mathsf{neg}\left(\color{blue}{2 \cdot \frac{1}{v}}\right)}, u\right)\right) \]
      13. lower-exp.f32N/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, \color{blue}{e^{\mathsf{neg}\left(2 \cdot \frac{1}{v}\right)}}, u\right)\right) \]
      14. associate-*r/N/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\mathsf{neg}\left(\color{blue}{\frac{2 \cdot 1}{v}}\right)}, u\right)\right) \]
      15. metadata-evalN/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\mathsf{neg}\left(\frac{\color{blue}{2}}{v}\right)}, u\right)\right) \]
      16. distribute-neg-fracN/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\color{blue}{\frac{\mathsf{neg}\left(2\right)}{v}}}, u\right)\right) \]
      17. metadata-evalN/A

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\frac{\color{blue}{-2}}{v}}, u\right)\right) \]
      18. lower-/.f3299.3

        \[\leadsto 1 + v \cdot \log \left(\mathsf{fma}\left(-u, e^{\color{blue}{\frac{-2}{v}}}, u\right)\right) \]
    7. Applied rewrites99.3%

      \[\leadsto 1 + v \cdot \log \color{blue}{\left(\mathsf{fma}\left(-u, e^{\frac{-2}{v}}, u\right)\right)} \]

    if 0.100000001 < v

    1. Initial program 94.7%

      \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
    2. Add Preprocessing
    3. Taylor expanded in v around inf

      \[\leadsto 1 + \color{blue}{\left(-2 \cdot \left(1 - u\right) + \frac{1}{2} \cdot \frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v}\right)} \]
    4. Step-by-step derivation
      1. +-commutativeN/A

        \[\leadsto 1 + \color{blue}{\left(\frac{1}{2} \cdot \frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v} + -2 \cdot \left(1 - u\right)\right)} \]
      2. *-commutativeN/A

        \[\leadsto 1 + \left(\color{blue}{\frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v} \cdot \frac{1}{2}} + -2 \cdot \left(1 - u\right)\right) \]
      3. lower-fma.f32N/A

        \[\leadsto 1 + \color{blue}{\mathsf{fma}\left(\frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right)} \]
      4. lower-/.f32N/A

        \[\leadsto 1 + \mathsf{fma}\left(\color{blue}{\frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v}}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
      5. unpow2N/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{-4 \cdot \color{blue}{\left(\left(1 - u\right) \cdot \left(1 - u\right)\right)} + 4 \cdot \left(1 - u\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
      6. associate-*r*N/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\color{blue}{\left(-4 \cdot \left(1 - u\right)\right) \cdot \left(1 - u\right)} + 4 \cdot \left(1 - u\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
      7. distribute-rgt-outN/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\color{blue}{\left(1 - u\right) \cdot \left(-4 \cdot \left(1 - u\right) + 4\right)}}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
      8. lower-*.f32N/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\color{blue}{\left(1 - u\right) \cdot \left(-4 \cdot \left(1 - u\right) + 4\right)}}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
      9. lower--.f32N/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\color{blue}{\left(1 - u\right)} \cdot \left(-4 \cdot \left(1 - u\right) + 4\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
      10. lower-fma.f32N/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \color{blue}{\mathsf{fma}\left(-4, 1 - u, 4\right)}}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
      11. lower--.f32N/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, \color{blue}{1 - u}, 4\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
      12. *-commutativeN/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, 1 - u, 4\right)}{v}, \frac{1}{2}, \color{blue}{\left(1 - u\right) \cdot -2}\right) \]
      13. lower-*.f32N/A

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, 1 - u, 4\right)}{v}, \frac{1}{2}, \color{blue}{\left(1 - u\right) \cdot -2}\right) \]
      14. lower--.f3247.3

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, 1 - u, 4\right)}{v}, 0.5, \color{blue}{\left(1 - u\right)} \cdot -2\right) \]
    5. Applied rewrites47.3%

      \[\leadsto 1 + \color{blue}{\mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, 1 - u, 4\right)}{v}, 0.5, \left(1 - u\right) \cdot -2\right)} \]
    6. Taylor expanded in u around inf

      \[\leadsto 1 + \mathsf{fma}\left(\frac{{u}^{2} \cdot \left(4 \cdot \frac{1}{u} - 4\right)}{v}, \frac{1}{2}, \left(1 - u\right) \cdot -2\right) \]
    7. Step-by-step derivation
      1. Applied rewrites45.2%

        \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(\left(\frac{4}{u} - 4\right) \cdot u\right) \cdot u}{v}, 0.5, \left(1 - u\right) \cdot -2\right) \]
      2. Step-by-step derivation
        1. Applied rewrites56.3%

          \[\leadsto 1 + \left(\left(1 - u\right) \cdot -2 + \color{blue}{\left(\left(\left(\frac{4}{u} - 4\right) \cdot u\right) \cdot u\right) \cdot \frac{0.5}{v}}\right) \]
      3. Recombined 2 regimes into one program.
      4. Add Preprocessing

      Alternative 4: 99.5% accurate, 1.0× speedup?

      \[\begin{array}{l} \\ 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \end{array} \]
      (FPCore (u v)
       :precision binary32
       (+ 1.0 (* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))))
      float code(float u, float v) {
      	return 1.0f + (v * logf((u + ((1.0f - u) * expf((-2.0f / v))))));
      }
      
      real(4) function code(u, v)
          real(4), intent (in) :: u
          real(4), intent (in) :: v
          code = 1.0e0 + (v * log((u + ((1.0e0 - u) * exp(((-2.0e0) / v))))))
      end function
      
      function code(u, v)
      	return Float32(Float32(1.0) + Float32(v * log(Float32(u + Float32(Float32(Float32(1.0) - u) * exp(Float32(Float32(-2.0) / v)))))))
      end
      
      function tmp = code(u, v)
      	tmp = single(1.0) + (v * log((u + ((single(1.0) - u) * exp((single(-2.0) / v))))));
      end
      
      \begin{array}{l}
      
      \\
      1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)
      \end{array}
      
      Derivation
      1. Initial program 99.6%

        \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
      2. Add Preprocessing
      3. Add Preprocessing

      Alternative 5: 95.9% accurate, 1.0× speedup?

      \[\begin{array}{l} \\ 1 + v \cdot \log \left(u + 1 \cdot {\mathsf{E}\left(\right)}^{\left(\frac{-2}{v}\right)}\right) \end{array} \]
      (FPCore (u v)
       :precision binary32
       (+ 1.0 (* v (log (+ u (* 1.0 (pow (E) (/ -2.0 v))))))))
      \begin{array}{l}
      
      \\
      1 + v \cdot \log \left(u + 1 \cdot {\mathsf{E}\left(\right)}^{\left(\frac{-2}{v}\right)}\right)
      \end{array}
      
      Derivation
      1. Initial program 99.6%

        \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
      2. Add Preprocessing
      3. Step-by-step derivation
        1. lift-exp.f32N/A

          \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{e^{\frac{-2}{v}}}\right) \]
        2. *-lft-identityN/A

          \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\color{blue}{1 \cdot \frac{-2}{v}}}\right) \]
        3. exp-prodN/A

          \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\left(e^{1}\right)}^{\left(\frac{-2}{v}\right)}}\right) \]
        4. lower-pow.f32N/A

          \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\left(e^{1}\right)}^{\left(\frac{-2}{v}\right)}}\right) \]
        5. exp-1-eN/A

          \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\mathsf{E}\left(\right)}}^{\left(\frac{-2}{v}\right)}\right) \]
        6. lower-E.f3299.6

          \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot {\color{blue}{\mathsf{E}\left(\right)}}^{\left(\frac{-2}{v}\right)}\right) \]
      4. Applied rewrites99.6%

        \[\leadsto 1 + v \cdot \log \left(u + \left(1 - u\right) \cdot \color{blue}{{\mathsf{E}\left(\right)}^{\left(\frac{-2}{v}\right)}}\right) \]
      5. Taylor expanded in u around 0

        \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{1} \cdot {\mathsf{E}\left(\right)}^{\left(\frac{-2}{v}\right)}\right) \]
      6. Step-by-step derivation
        1. Applied rewrites96.7%

          \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{1} \cdot {\mathsf{E}\left(\right)}^{\left(\frac{-2}{v}\right)}\right) \]
        2. Add Preprocessing

        Alternative 6: 87.2% accurate, 1.8× speedup?

        \[\begin{array}{l} \\ 1 + v \cdot \log \left(\frac{u}{v} \cdot 2\right) \end{array} \]
        (FPCore (u v) :precision binary32 (+ 1.0 (* v (log (* (/ u v) 2.0)))))
        float code(float u, float v) {
        	return 1.0f + (v * logf(((u / v) * 2.0f)));
        }
        
        real(4) function code(u, v)
            real(4), intent (in) :: u
            real(4), intent (in) :: v
            code = 1.0e0 + (v * log(((u / v) * 2.0e0)))
        end function
        
        function code(u, v)
        	return Float32(Float32(1.0) + Float32(v * log(Float32(Float32(u / v) * Float32(2.0)))))
        end
        
        function tmp = code(u, v)
        	tmp = single(1.0) + (v * log(((u / v) * single(2.0))));
        end
        
        \begin{array}{l}
        
        \\
        1 + v \cdot \log \left(\frac{u}{v} \cdot 2\right)
        \end{array}
        
        Derivation
        1. Initial program 99.6%

          \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
        2. Add Preprocessing
        3. Step-by-step derivation
          1. lift-+.f32N/A

            \[\leadsto 1 + v \cdot \log \color{blue}{\left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right)} \]
          2. lift-*.f32N/A

            \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{\left(1 - u\right) \cdot e^{\frac{-2}{v}}}\right) \]
          3. *-commutativeN/A

            \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{e^{\frac{-2}{v}} \cdot \left(1 - u\right)}\right) \]
          4. lift--.f32N/A

            \[\leadsto 1 + v \cdot \log \left(u + e^{\frac{-2}{v}} \cdot \color{blue}{\left(1 - u\right)}\right) \]
          5. sub-negN/A

            \[\leadsto 1 + v \cdot \log \left(u + e^{\frac{-2}{v}} \cdot \color{blue}{\left(1 + \left(\mathsf{neg}\left(u\right)\right)\right)}\right) \]
          6. distribute-rgt-inN/A

            \[\leadsto 1 + v \cdot \log \left(u + \color{blue}{\left(1 \cdot e^{\frac{-2}{v}} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)}\right) \]
          7. *-lft-identityN/A

            \[\leadsto 1 + v \cdot \log \left(u + \left(\color{blue}{e^{\frac{-2}{v}}} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)\right) \]
          8. associate-+r+N/A

            \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)} \]
          9. lower-+.f32N/A

            \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right)} \]
          10. lower-+.f32N/A

            \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(u + e^{\frac{-2}{v}}\right)} + \left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}\right) \]
          11. lower-*.f32N/A

            \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(\mathsf{neg}\left(u\right)\right) \cdot e^{\frac{-2}{v}}}\right) \]
          12. lower-neg.f3299.6

            \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(-u\right)} \cdot e^{\frac{-2}{v}}\right) \]
        4. Applied rewrites99.6%

          \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(-u\right) \cdot e^{\frac{-2}{v}}\right)} \]
        5. Step-by-step derivation
          1. lift-+.f32N/A

            \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) + \left(-u\right) \cdot e^{\frac{-2}{v}}\right)} \]
          2. lift-*.f32N/A

            \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(-u\right) \cdot e^{\frac{-2}{v}}}\right) \]
          3. lift-neg.f32N/A

            \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(\mathsf{neg}\left(u\right)\right)} \cdot e^{\frac{-2}{v}}\right) \]
          4. distribute-lft-neg-outN/A

            \[\leadsto 1 + v \cdot \log \left(\left(u + e^{\frac{-2}{v}}\right) + \color{blue}{\left(\mathsf{neg}\left(u \cdot e^{\frac{-2}{v}}\right)\right)}\right) \]
          5. unsub-negN/A

            \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) - u \cdot e^{\frac{-2}{v}}\right)} \]
          6. lower--.f32N/A

            \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(u + e^{\frac{-2}{v}}\right) - u \cdot e^{\frac{-2}{v}}\right)} \]
          7. lift-+.f32N/A

            \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(u + e^{\frac{-2}{v}}\right)} - u \cdot e^{\frac{-2}{v}}\right) \]
          8. +-commutativeN/A

            \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(e^{\frac{-2}{v}} + u\right)} - u \cdot e^{\frac{-2}{v}}\right) \]
          9. lower-+.f32N/A

            \[\leadsto 1 + v \cdot \log \left(\color{blue}{\left(e^{\frac{-2}{v}} + u\right)} - u \cdot e^{\frac{-2}{v}}\right) \]
          10. *-commutativeN/A

            \[\leadsto 1 + v \cdot \log \left(\left(e^{\frac{-2}{v}} + u\right) - \color{blue}{e^{\frac{-2}{v}} \cdot u}\right) \]
          11. lower-*.f3299.6

            \[\leadsto 1 + v \cdot \log \left(\left(e^{\frac{-2}{v}} + u\right) - \color{blue}{e^{\frac{-2}{v}} \cdot u}\right) \]
        6. Applied rewrites99.6%

          \[\leadsto 1 + v \cdot \log \color{blue}{\left(\left(e^{\frac{-2}{v}} + u\right) - e^{\frac{-2}{v}} \cdot u\right)} \]
        7. Taylor expanded in v around inf

          \[\leadsto 1 + v \cdot \log \color{blue}{\left(1 + -1 \cdot \frac{2 + -2 \cdot u}{v}\right)} \]
        8. Step-by-step derivation
          1. +-commutativeN/A

            \[\leadsto 1 + v \cdot \log \color{blue}{\left(-1 \cdot \frac{2 + -2 \cdot u}{v} + 1\right)} \]
          2. metadata-evalN/A

            \[\leadsto 1 + v \cdot \log \left(-1 \cdot \frac{2 + \color{blue}{\left(\mathsf{neg}\left(2\right)\right)} \cdot u}{v} + 1\right) \]
          3. cancel-sign-sub-invN/A

            \[\leadsto 1 + v \cdot \log \left(-1 \cdot \frac{\color{blue}{2 - 2 \cdot u}}{v} + 1\right) \]
          4. associate-*r/N/A

            \[\leadsto 1 + v \cdot \log \left(\color{blue}{\frac{-1 \cdot \left(2 - 2 \cdot u\right)}{v}} + 1\right) \]
          5. cancel-sign-sub-invN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{-1 \cdot \color{blue}{\left(2 + \left(\mathsf{neg}\left(2\right)\right) \cdot u\right)}}{v} + 1\right) \]
          6. metadata-evalN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{-1 \cdot \left(2 + \color{blue}{-2} \cdot u\right)}{v} + 1\right) \]
          7. distribute-rgt-inN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{\color{blue}{2 \cdot -1 + \left(-2 \cdot u\right) \cdot -1}}{v} + 1\right) \]
          8. metadata-evalN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{\color{blue}{-2} + \left(-2 \cdot u\right) \cdot -1}{v} + 1\right) \]
          9. metadata-evalN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{\color{blue}{-2 \cdot 1} + \left(-2 \cdot u\right) \cdot -1}{v} + 1\right) \]
          10. associate-*l*N/A

            \[\leadsto 1 + v \cdot \log \left(\frac{-2 \cdot 1 + \color{blue}{-2 \cdot \left(u \cdot -1\right)}}{v} + 1\right) \]
          11. *-commutativeN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{-2 \cdot 1 + -2 \cdot \color{blue}{\left(-1 \cdot u\right)}}{v} + 1\right) \]
          12. distribute-lft-inN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{\color{blue}{-2 \cdot \left(1 + -1 \cdot u\right)}}{v} + 1\right) \]
          13. mul-1-negN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{-2 \cdot \left(1 + \color{blue}{\left(\mathsf{neg}\left(u\right)\right)}\right)}{v} + 1\right) \]
          14. sub-negN/A

            \[\leadsto 1 + v \cdot \log \left(\frac{-2 \cdot \color{blue}{\left(1 - u\right)}}{v} + 1\right) \]
          15. associate-*r/N/A

            \[\leadsto 1 + v \cdot \log \left(\color{blue}{-2 \cdot \frac{1 - u}{v}} + 1\right) \]
          16. *-commutativeN/A

            \[\leadsto 1 + v \cdot \log \left(\color{blue}{\frac{1 - u}{v} \cdot -2} + 1\right) \]
          17. lower-fma.f32N/A

            \[\leadsto 1 + v \cdot \log \color{blue}{\left(\mathsf{fma}\left(\frac{1 - u}{v}, -2, 1\right)\right)} \]
        9. Applied rewrites81.0%

          \[\leadsto 1 + v \cdot \log \color{blue}{\left(\mathsf{fma}\left(\frac{1 - u}{v}, -2, 1\right)\right)} \]
        10. Taylor expanded in u around inf

          \[\leadsto 1 + v \cdot \log \left(2 \cdot \color{blue}{\frac{u}{v}}\right) \]
        11. Step-by-step derivation
          1. Applied rewrites86.7%

            \[\leadsto 1 + v \cdot \log \left(\frac{u}{v} \cdot \color{blue}{2}\right) \]
          2. Final simplification86.7%

            \[\leadsto 1 + v \cdot \log \left(\frac{u}{v} \cdot 2\right) \]
          3. Add Preprocessing

          Alternative 7: 90.5% accurate, 3.8× speedup?

          \[\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;v \leq 0.20000000298023224:\\ \;\;\;\;1\\ \mathbf{else}:\\ \;\;\;\;1 + \left(\left(1 - u\right) \cdot -2 + \left(\left(\left(\frac{4}{u} - 4\right) \cdot u\right) \cdot u\right) \cdot \frac{0.5}{v}\right)\\ \end{array} \end{array} \]
          (FPCore (u v)
           :precision binary32
           (if (<= v 0.20000000298023224)
             1.0
             (+ 1.0 (+ (* (- 1.0 u) -2.0) (* (* (* (- (/ 4.0 u) 4.0) u) u) (/ 0.5 v))))))
          float code(float u, float v) {
          	float tmp;
          	if (v <= 0.20000000298023224f) {
          		tmp = 1.0f;
          	} else {
          		tmp = 1.0f + (((1.0f - u) * -2.0f) + (((((4.0f / u) - 4.0f) * u) * u) * (0.5f / v)));
          	}
          	return tmp;
          }
          
          real(4) function code(u, v)
              real(4), intent (in) :: u
              real(4), intent (in) :: v
              real(4) :: tmp
              if (v <= 0.20000000298023224e0) then
                  tmp = 1.0e0
              else
                  tmp = 1.0e0 + (((1.0e0 - u) * (-2.0e0)) + (((((4.0e0 / u) - 4.0e0) * u) * u) * (0.5e0 / v)))
              end if
              code = tmp
          end function
          
          function code(u, v)
          	tmp = Float32(0.0)
          	if (v <= Float32(0.20000000298023224))
          		tmp = Float32(1.0);
          	else
          		tmp = Float32(Float32(1.0) + Float32(Float32(Float32(Float32(1.0) - u) * Float32(-2.0)) + Float32(Float32(Float32(Float32(Float32(Float32(4.0) / u) - Float32(4.0)) * u) * u) * Float32(Float32(0.5) / v))));
          	end
          	return tmp
          end
          
          function tmp_2 = code(u, v)
          	tmp = single(0.0);
          	if (v <= single(0.20000000298023224))
          		tmp = single(1.0);
          	else
          		tmp = single(1.0) + (((single(1.0) - u) * single(-2.0)) + (((((single(4.0) / u) - single(4.0)) * u) * u) * (single(0.5) / v)));
          	end
          	tmp_2 = tmp;
          end
          
          \begin{array}{l}
          
          \\
          \begin{array}{l}
          \mathbf{if}\;v \leq 0.20000000298023224:\\
          \;\;\;\;1\\
          
          \mathbf{else}:\\
          \;\;\;\;1 + \left(\left(1 - u\right) \cdot -2 + \left(\left(\left(\frac{4}{u} - 4\right) \cdot u\right) \cdot u\right) \cdot \frac{0.5}{v}\right)\\
          
          
          \end{array}
          \end{array}
          
          Derivation
          1. Split input into 2 regimes
          2. if v < 0.200000003

            1. Initial program 100.0%

              \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
            2. Add Preprocessing
            3. Taylor expanded in v around 0

              \[\leadsto \color{blue}{1} \]
            4. Step-by-step derivation
              1. Applied rewrites91.3%

                \[\leadsto \color{blue}{1} \]

              if 0.200000003 < v

              1. Initial program 94.3%

                \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
              2. Add Preprocessing
              3. Taylor expanded in v around inf

                \[\leadsto 1 + \color{blue}{\left(-2 \cdot \left(1 - u\right) + \frac{1}{2} \cdot \frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v}\right)} \]
              4. Step-by-step derivation
                1. +-commutativeN/A

                  \[\leadsto 1 + \color{blue}{\left(\frac{1}{2} \cdot \frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v} + -2 \cdot \left(1 - u\right)\right)} \]
                2. *-commutativeN/A

                  \[\leadsto 1 + \left(\color{blue}{\frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v} \cdot \frac{1}{2}} + -2 \cdot \left(1 - u\right)\right) \]
                3. lower-fma.f32N/A

                  \[\leadsto 1 + \color{blue}{\mathsf{fma}\left(\frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right)} \]
                4. lower-/.f32N/A

                  \[\leadsto 1 + \mathsf{fma}\left(\color{blue}{\frac{-4 \cdot {\left(1 - u\right)}^{2} + 4 \cdot \left(1 - u\right)}{v}}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
                5. unpow2N/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{-4 \cdot \color{blue}{\left(\left(1 - u\right) \cdot \left(1 - u\right)\right)} + 4 \cdot \left(1 - u\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
                6. associate-*r*N/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\color{blue}{\left(-4 \cdot \left(1 - u\right)\right) \cdot \left(1 - u\right)} + 4 \cdot \left(1 - u\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
                7. distribute-rgt-outN/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\color{blue}{\left(1 - u\right) \cdot \left(-4 \cdot \left(1 - u\right) + 4\right)}}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
                8. lower-*.f32N/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\color{blue}{\left(1 - u\right) \cdot \left(-4 \cdot \left(1 - u\right) + 4\right)}}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
                9. lower--.f32N/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\color{blue}{\left(1 - u\right)} \cdot \left(-4 \cdot \left(1 - u\right) + 4\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
                10. lower-fma.f32N/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \color{blue}{\mathsf{fma}\left(-4, 1 - u, 4\right)}}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
                11. lower--.f32N/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, \color{blue}{1 - u}, 4\right)}{v}, \frac{1}{2}, -2 \cdot \left(1 - u\right)\right) \]
                12. *-commutativeN/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, 1 - u, 4\right)}{v}, \frac{1}{2}, \color{blue}{\left(1 - u\right) \cdot -2}\right) \]
                13. lower-*.f32N/A

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, 1 - u, 4\right)}{v}, \frac{1}{2}, \color{blue}{\left(1 - u\right) \cdot -2}\right) \]
                14. lower--.f3252.8

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, 1 - u, 4\right)}{v}, 0.5, \color{blue}{\left(1 - u\right)} \cdot -2\right) \]
              5. Applied rewrites52.8%

                \[\leadsto 1 + \color{blue}{\mathsf{fma}\left(\frac{\left(1 - u\right) \cdot \mathsf{fma}\left(-4, 1 - u, 4\right)}{v}, 0.5, \left(1 - u\right) \cdot -2\right)} \]
              6. Taylor expanded in u around inf

                \[\leadsto 1 + \mathsf{fma}\left(\frac{{u}^{2} \cdot \left(4 \cdot \frac{1}{u} - 4\right)}{v}, \frac{1}{2}, \left(1 - u\right) \cdot -2\right) \]
              7. Step-by-step derivation
                1. Applied rewrites50.4%

                  \[\leadsto 1 + \mathsf{fma}\left(\frac{\left(\left(\frac{4}{u} - 4\right) \cdot u\right) \cdot u}{v}, 0.5, \left(1 - u\right) \cdot -2\right) \]
                2. Step-by-step derivation
                  1. Applied rewrites63.0%

                    \[\leadsto 1 + \left(\left(1 - u\right) \cdot -2 + \color{blue}{\left(\left(\left(\frac{4}{u} - 4\right) \cdot u\right) \cdot u\right) \cdot \frac{0.5}{v}}\right) \]
                3. Recombined 2 regimes into one program.
                4. Add Preprocessing

                Alternative 8: 86.7% accurate, 231.0× speedup?

                \[\begin{array}{l} \\ 1 \end{array} \]
                (FPCore (u v) :precision binary32 1.0)
                float code(float u, float v) {
                	return 1.0f;
                }
                
                real(4) function code(u, v)
                    real(4), intent (in) :: u
                    real(4), intent (in) :: v
                    code = 1.0e0
                end function
                
                function code(u, v)
                	return Float32(1.0)
                end
                
                function tmp = code(u, v)
                	tmp = single(1.0);
                end
                
                \begin{array}{l}
                
                \\
                1
                \end{array}
                
                Derivation
                1. Initial program 99.6%

                  \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
                2. Add Preprocessing
                3. Taylor expanded in v around 0

                  \[\leadsto \color{blue}{1} \]
                4. Step-by-step derivation
                  1. Applied rewrites86.0%

                    \[\leadsto \color{blue}{1} \]
                  2. Add Preprocessing

                  Alternative 9: 5.9% accurate, 231.0× speedup?

                  \[\begin{array}{l} \\ -1 \end{array} \]
                  (FPCore (u v) :precision binary32 -1.0)
                  float code(float u, float v) {
                  	return -1.0f;
                  }
                  
                  real(4) function code(u, v)
                      real(4), intent (in) :: u
                      real(4), intent (in) :: v
                      code = -1.0e0
                  end function
                  
                  function code(u, v)
                  	return Float32(-1.0)
                  end
                  
                  function tmp = code(u, v)
                  	tmp = single(-1.0);
                  end
                  
                  \begin{array}{l}
                  
                  \\
                  -1
                  \end{array}
                  
                  Derivation
                  1. Initial program 99.6%

                    \[1 + v \cdot \log \left(u + \left(1 - u\right) \cdot e^{\frac{-2}{v}}\right) \]
                  2. Add Preprocessing
                  3. Taylor expanded in u around 0

                    \[\leadsto \color{blue}{-1} \]
                  4. Step-by-step derivation
                    1. Applied rewrites5.7%

                      \[\leadsto \color{blue}{-1} \]
                    2. Add Preprocessing

                    Reproduce

                    ?
                    herbie shell --seed 2024322 
                    (FPCore (u v)
                      :name "HairBSDF, sample_f, cosTheta"
                      :precision binary32
                      :pre (and (and (<= 1e-5 u) (<= u 1.0)) (and (<= 0.0 v) (<= v 109.746574)))
                      (+ 1.0 (* v (log (+ u (* (- 1.0 u) (exp (/ -2.0 v))))))))