HairBSDF, sample_f, cosTheta

Percentage Accurate: 99.5% → 99.4%
Time: 11.9s
Alternatives: 7
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 7 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.9× speedup?

\[\begin{array}{l} \\ \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, \frac{1 - u \cdot \left(u \cdot u\right)}{\mathsf{fma}\left(u, 1 + u, 1\right)}, u\right)\right), 1\right) \end{array} \]
(FPCore (u v)
 :precision binary32
 (fma
  v
  (log
   (fma (exp (/ -2.0 v)) (/ (- 1.0 (* u (* u u))) (fma u (+ 1.0 u) 1.0)) u))
  1.0))
float code(float u, float v) {
	return fmaf(v, logf(fmaf(expf((-2.0f / v)), ((1.0f - (u * (u * u))) / fmaf(u, (1.0f + u), 1.0f)), u)), 1.0f);
}
function code(u, v)
	return fma(v, log(fma(exp(Float32(Float32(-2.0) / v)), Float32(Float32(Float32(1.0) - Float32(u * Float32(u * u))) / fma(u, Float32(Float32(1.0) + u), Float32(1.0))), u)), Float32(1.0))
end
\begin{array}{l}

\\
\mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, \frac{1 - u \cdot \left(u \cdot u\right)}{\mathsf{fma}\left(u, 1 + u, 1\right)}, u\right)\right), 1\right)
\end{array}
Derivation
  1. Initial program 99.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 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\color{blue}{\frac{-2}{v}}}, 1 - u, u\right)\right), 1\right) \]
    16. lower--.f3299.7

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, \color{blue}{1 - u}, u\right)\right), 1\right) \]
  5. Simplified99.7%

    \[\leadsto \color{blue}{\mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, 1 - u, u\right)\right), 1\right)} \]
  6. Step-by-step derivation
    1. flip3--N/A

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Alternative 2: 99.5% accurate, 1.0× speedup?

\[\begin{array}{l} \\ \mathsf{fma}\left(v, \log \left(u + e^{\frac{-2}{v}} \cdot \left(1 - u\right)\right), 1\right) \end{array} \]
(FPCore (u v)
 :precision binary32
 (fma v (log (+ u (* (exp (/ -2.0 v)) (- 1.0 u)))) 1.0))
float code(float u, float v) {
	return fmaf(v, logf((u + (expf((-2.0f / v)) * (1.0f - u)))), 1.0f);
}
function code(u, v)
	return fma(v, log(Float32(u + Float32(exp(Float32(Float32(-2.0) / v)) * Float32(Float32(1.0) - u)))), Float32(1.0))
end
\begin{array}{l}

\\
\mathsf{fma}\left(v, \log \left(u + e^{\frac{-2}{v}} \cdot \left(1 - u\right)\right), 1\right)
\end{array}
Derivation
  1. Initial program 99.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 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\color{blue}{\frac{-2}{v}}}, 1 - u, u\right)\right), 1\right) \]
    16. lower--.f3299.7

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, \color{blue}{1 - u}, u\right)\right), 1\right) \]
  5. Simplified99.7%

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

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

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

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

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

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

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

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

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

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

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

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(\frac{1}{\color{blue}{e^{\frac{2}{v}}}}, 1 - u, u\right)\right), 1\right) \]
    12. lift-/.f3299.7

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

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

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

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

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

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

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

Alternative 3: 99.5% accurate, 1.0× speedup?

\[\begin{array}{l} \\ \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, 1 - u, u\right)\right), 1\right) \end{array} \]
(FPCore (u v)
 :precision binary32
 (fma v (log (fma (exp (/ -2.0 v)) (- 1.0 u) u)) 1.0))
float code(float u, float v) {
	return fmaf(v, logf(fmaf(expf((-2.0f / v)), (1.0f - u), u)), 1.0f);
}
function code(u, v)
	return fma(v, log(fma(exp(Float32(Float32(-2.0) / v)), Float32(Float32(1.0) - u), u)), Float32(1.0))
end
\begin{array}{l}

\\
\mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, 1 - u, u\right)\right), 1\right)
\end{array}
Derivation
  1. Initial program 99.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 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\color{blue}{\frac{-2}{v}}}, 1 - u, u\right)\right), 1\right) \]
    16. lower--.f3299.7

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, \color{blue}{1 - u}, u\right)\right), 1\right) \]
  5. Simplified99.7%

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

Alternative 4: 95.9% accurate, 1.0× speedup?

\[\begin{array}{l} \\ \mathsf{fma}\left(v, \log \left(e^{\frac{-2}{v}} + u\right), 1\right) \end{array} \]
(FPCore (u v) :precision binary32 (fma v (log (+ (exp (/ -2.0 v)) u)) 1.0))
float code(float u, float v) {
	return fmaf(v, logf((expf((-2.0f / v)) + u)), 1.0f);
}
function code(u, v)
	return fma(v, log(Float32(exp(Float32(Float32(-2.0) / v)) + u)), Float32(1.0))
end
\begin{array}{l}

\\
\mathsf{fma}\left(v, \log \left(e^{\frac{-2}{v}} + u\right), 1\right)
\end{array}
Derivation
  1. Initial program 99.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 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\color{blue}{\frac{-2}{v}}}, 1 - u, u\right)\right), 1\right) \]
    16. lower--.f3299.7

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(e^{\frac{-2}{v}}, \color{blue}{1 - u}, u\right)\right), 1\right) \]
  5. Simplified99.7%

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

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

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

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

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

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

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

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

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

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

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

      \[\leadsto \mathsf{fma}\left(v, \log \left(\mathsf{fma}\left(\frac{1}{\color{blue}{e^{\frac{2}{v}}}}, 1 - u, u\right)\right), 1\right) \]
    12. lift-/.f3299.7

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Alternative 5: 94.3% accurate, 2.2× speedup?

\[\begin{array}{l} \\ \mathsf{fma}\left(v, \log u, 1\right) \end{array} \]
(FPCore (u v) :precision binary32 (fma v (log u) 1.0))
float code(float u, float v) {
	return fmaf(v, logf(u), 1.0f);
}
function code(u, v)
	return fma(v, log(u), Float32(1.0))
end
\begin{array}{l}

\\
\mathsf{fma}\left(v, \log u, 1\right)
\end{array}
Derivation
  1. Initial program 99.7%

    \[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. frac-2negN/A

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

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

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

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

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

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

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

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

    \[\leadsto \color{blue}{1 + v \cdot \log u} \]
  6. Step-by-step derivation
    1. +-commutativeN/A

      \[\leadsto \color{blue}{v \cdot \log u + 1} \]
    2. remove-double-negN/A

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

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

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

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

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

      \[\leadsto \color{blue}{\mathsf{fma}\left(v, -1 \cdot \log \left(\frac{1}{u}\right), 1\right)} \]
    8. log-recN/A

      \[\leadsto \mathsf{fma}\left(v, -1 \cdot \color{blue}{\left(\mathsf{neg}\left(\log u\right)\right)}, 1\right) \]
    9. mul-1-negN/A

      \[\leadsto \mathsf{fma}\left(v, -1 \cdot \color{blue}{\left(-1 \cdot \log u\right)}, 1\right) \]
    10. mul-1-negN/A

      \[\leadsto \mathsf{fma}\left(v, \color{blue}{\mathsf{neg}\left(-1 \cdot \log u\right)}, 1\right) \]
    11. mul-1-negN/A

      \[\leadsto \mathsf{fma}\left(v, \mathsf{neg}\left(\color{blue}{\left(\mathsf{neg}\left(\log u\right)\right)}\right), 1\right) \]
    12. remove-double-negN/A

      \[\leadsto \mathsf{fma}\left(v, \color{blue}{\log u}, 1\right) \]
    13. lower-log.f3296.0

      \[\leadsto \mathsf{fma}\left(v, \color{blue}{\log u}, 1\right) \]
  7. Simplified96.0%

    \[\leadsto \color{blue}{\mathsf{fma}\left(v, \log u, 1\right)} \]
  8. Add Preprocessing

Alternative 6: 86.4% 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.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 0

    \[\leadsto \color{blue}{1} \]
  4. Step-by-step derivation
    1. Simplified89.2%

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

    Alternative 7: 6.0% 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.7%

      \[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. Simplified5.1%

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

      Reproduce

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