Disney BSSRDF, sample scattering profile, lower

Percentage Accurate: 61.0% → 99.4%
Time: 2.9s
Alternatives: 8
Speedup: 11.4×

Specification

?
\[\left(0 \leq s \land s \leq 256\right) \land \left(2.328306437 \cdot 10^{-10} \leq u \land u \leq 0.25\right)\]
\[\begin{array}{l} \\ s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \end{array} \]
(FPCore (s u) :precision binary32 (* s (log (/ 1.0 (- 1.0 (* 4.0 u))))))
float code(float s, float u) {
	return s * logf((1.0f / (1.0f - (4.0f * u))));
}
module fmin_fmax_functions
    implicit none
    private
    public fmax
    public fmin

    interface fmax
        module procedure fmax88
        module procedure fmax44
        module procedure fmax84
        module procedure fmax48
    end interface
    interface fmin
        module procedure fmin88
        module procedure fmin44
        module procedure fmin84
        module procedure fmin48
    end interface
contains
    real(8) function fmax88(x, y) result (res)
        real(8), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(x, max(x, y), y /= y), x /= x)
    end function
    real(4) function fmax44(x, y) result (res)
        real(4), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(y, merge(x, max(x, y), y /= y), x /= x)
    end function
    real(8) function fmax84(x, y) result(res)
        real(8), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(dble(y), merge(x, max(x, dble(y)), y /= y), x /= x)
    end function
    real(8) function fmax48(x, y) result(res)
        real(4), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(dble(x), max(dble(x), y), y /= y), x /= x)
    end function
    real(8) function fmin88(x, y) result (res)
        real(8), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(x, min(x, y), y /= y), x /= x)
    end function
    real(4) function fmin44(x, y) result (res)
        real(4), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(y, merge(x, min(x, y), y /= y), x /= x)
    end function
    real(8) function fmin84(x, y) result(res)
        real(8), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(dble(y), merge(x, min(x, dble(y)), y /= y), x /= x)
    end function
    real(8) function fmin48(x, y) result(res)
        real(4), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(dble(x), min(dble(x), y), y /= y), x /= x)
    end function
end module

real(4) function code(s, u)
use fmin_fmax_functions
    real(4), intent (in) :: s
    real(4), intent (in) :: u
    code = s * log((1.0e0 / (1.0e0 - (4.0e0 * u))))
end function
function code(s, u)
	return Float32(s * log(Float32(Float32(1.0) / Float32(Float32(1.0) - Float32(Float32(4.0) * u)))))
end
function tmp = code(s, u)
	tmp = s * log((single(1.0) / (single(1.0) - (single(4.0) * u))));
end
\begin{array}{l}

\\
s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right)
\end{array}

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 8 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: 61.0% accurate, 1.0× speedup?

\[\begin{array}{l} \\ s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \end{array} \]
(FPCore (s u) :precision binary32 (* s (log (/ 1.0 (- 1.0 (* 4.0 u))))))
float code(float s, float u) {
	return s * logf((1.0f / (1.0f - (4.0f * u))));
}
module fmin_fmax_functions
    implicit none
    private
    public fmax
    public fmin

    interface fmax
        module procedure fmax88
        module procedure fmax44
        module procedure fmax84
        module procedure fmax48
    end interface
    interface fmin
        module procedure fmin88
        module procedure fmin44
        module procedure fmin84
        module procedure fmin48
    end interface
contains
    real(8) function fmax88(x, y) result (res)
        real(8), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(x, max(x, y), y /= y), x /= x)
    end function
    real(4) function fmax44(x, y) result (res)
        real(4), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(y, merge(x, max(x, y), y /= y), x /= x)
    end function
    real(8) function fmax84(x, y) result(res)
        real(8), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(dble(y), merge(x, max(x, dble(y)), y /= y), x /= x)
    end function
    real(8) function fmax48(x, y) result(res)
        real(4), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(dble(x), max(dble(x), y), y /= y), x /= x)
    end function
    real(8) function fmin88(x, y) result (res)
        real(8), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(x, min(x, y), y /= y), x /= x)
    end function
    real(4) function fmin44(x, y) result (res)
        real(4), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(y, merge(x, min(x, y), y /= y), x /= x)
    end function
    real(8) function fmin84(x, y) result(res)
        real(8), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(dble(y), merge(x, min(x, dble(y)), y /= y), x /= x)
    end function
    real(8) function fmin48(x, y) result(res)
        real(4), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(dble(x), min(dble(x), y), y /= y), x /= x)
    end function
end module

real(4) function code(s, u)
use fmin_fmax_functions
    real(4), intent (in) :: s
    real(4), intent (in) :: u
    code = s * log((1.0e0 / (1.0e0 - (4.0e0 * u))))
end function
function code(s, u)
	return Float32(s * log(Float32(Float32(1.0) / Float32(Float32(1.0) - Float32(Float32(4.0) * u)))))
end
function tmp = code(s, u)
	tmp = s * log((single(1.0) / (single(1.0) - (single(4.0) * u))));
end
\begin{array}{l}

\\
s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right)
\end{array}

Alternative 1: 99.4% accurate, 1.1× speedup?

\[\begin{array}{l} \\ \left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s \end{array} \]
(FPCore (s u) :precision binary32 (* (- (log1p (* -4.0 u))) s))
float code(float s, float u) {
	return -log1pf((-4.0f * u)) * s;
}
function code(s, u)
	return Float32(Float32(-log1p(Float32(Float32(-4.0) * u))) * s)
end
\begin{array}{l}

\\
\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s
\end{array}
Derivation
  1. Initial program 61.0%

    \[s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \]
  2. Step-by-step derivation
    1. lift-*.f32N/A

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right) \cdot s} \]
    3. lower-*.f3261.0

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    5. lift-/.f32N/A

      \[\leadsto \log \color{blue}{\left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    6. log-recN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\log \left(1 - 4 \cdot u\right)\right)\right)} \cdot s \]
    7. lower-neg.f32N/A

      \[\leadsto \color{blue}{\left(-\log \left(1 - 4 \cdot u\right)\right)} \cdot s \]
    8. lift--.f32N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 - 4 \cdot u\right)}\right) \cdot s \]
    9. sub-negate1N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(4 \cdot u\right)\right)\right)}\right) \cdot s \]
    10. lower-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(4 \cdot u\right)\right)}\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{4 \cdot u}\right)\right)\right) \cdot s \]
    12. distribute-lft-neg-inN/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    14. metadata-eval99.4

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{-4} \cdot u\right)\right) \cdot s \]
  3. Applied rewrites99.4%

    \[\leadsto \color{blue}{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s} \]
  4. Add Preprocessing

Alternative 2: 93.4% accurate, 2.8× speedup?

\[\begin{array}{l} \\ \mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(64, s \cdot u, 21.333333333333332 \cdot s\right), u, 8 \cdot s\right), u, s \cdot 4\right) \cdot u \end{array} \]
(FPCore (s u)
 :precision binary32
 (*
  (fma
   (fma (fma 64.0 (* s u) (* 21.333333333333332 s)) u (* 8.0 s))
   u
   (* s 4.0))
  u))
float code(float s, float u) {
	return fmaf(fmaf(fmaf(64.0f, (s * u), (21.333333333333332f * s)), u, (8.0f * s)), u, (s * 4.0f)) * u;
}
function code(s, u)
	return Float32(fma(fma(fma(Float32(64.0), Float32(s * u), Float32(Float32(21.333333333333332) * s)), u, Float32(Float32(8.0) * s)), u, Float32(s * Float32(4.0))) * u)
end
\begin{array}{l}

\\
\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(64, s \cdot u, 21.333333333333332 \cdot s\right), u, 8 \cdot s\right), u, s \cdot 4\right) \cdot u
\end{array}
Derivation
  1. Initial program 61.0%

    \[s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \]
  2. Step-by-step derivation
    1. lift-*.f32N/A

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right) \cdot s} \]
    3. lower-*.f3261.0

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    5. lift-/.f32N/A

      \[\leadsto \log \color{blue}{\left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    6. log-recN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\log \left(1 - 4 \cdot u\right)\right)\right)} \cdot s \]
    7. lower-neg.f32N/A

      \[\leadsto \color{blue}{\left(-\log \left(1 - 4 \cdot u\right)\right)} \cdot s \]
    8. lift--.f32N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 - 4 \cdot u\right)}\right) \cdot s \]
    9. sub-negate1N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(4 \cdot u\right)\right)\right)}\right) \cdot s \]
    10. lower-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(4 \cdot u\right)\right)}\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{4 \cdot u}\right)\right)\right) \cdot s \]
    12. distribute-lft-neg-inN/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    14. metadata-eval99.4

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{-4} \cdot u\right)\right) \cdot s \]
  3. Applied rewrites99.4%

    \[\leadsto \color{blue}{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s} \]
  4. Step-by-step derivation
    1. lift-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\log \left(1 + -4 \cdot u\right)}\right) \cdot s \]
    2. flip-+N/A

      \[\leadsto \left(-\log \color{blue}{\left(\frac{1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}{1 - -4 \cdot u}\right)}\right) \cdot s \]
    3. log-divN/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    4. lower--.f32N/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    5. metadata-evalN/A

      \[\leadsto \left(-\left(\log \left(\color{blue}{1} - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    6. sub-negate1N/A

      \[\leadsto \left(-\left(\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    7. lower-log1p.f32N/A

      \[\leadsto \left(-\left(\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    8. lower-neg.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(\color{blue}{-\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    10. lower-pow.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(-4 \cdot u\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    14. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \log \left(1 - \color{blue}{-4 \cdot u}\right)\right)\right) \cdot s \]
    15. fp-cancel-sub-sign-invN/A

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

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \color{blue}{\mathsf{log1p}\left(\left(\mathsf{neg}\left(-4\right)\right) \cdot u\right)}\right)\right) \cdot s \]
    17. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(-4\right)\right) \cdot u}\right)\right)\right) \cdot s \]
    18. metadata-eval99.1

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{4} \cdot u\right)\right)\right) \cdot s \]
  5. Applied rewrites99.1%

    \[\leadsto \left(-\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right) \cdot s \]
  6. Applied rewrites74.6%

    \[\leadsto \color{blue}{\frac{{\left(\mathsf{log1p}\left(-4 \cdot u\right)\right)}^{4} \cdot s}{{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right)}^{3}}} \]
  7. Taylor expanded in u around 0

    \[\leadsto \color{blue}{u \cdot \left(4 \cdot s + u \cdot \left(8 \cdot s + u \cdot \left(\frac{64}{3} \cdot s + 64 \cdot \left(s \cdot u\right)\right)\right)\right)} \]
  8. Step-by-step derivation
    1. *-commutativeN/A

      \[\leadsto \left(4 \cdot s + u \cdot \left(8 \cdot s + u \cdot \left(\frac{64}{3} \cdot s + 64 \cdot \left(s \cdot u\right)\right)\right)\right) \cdot \color{blue}{u} \]
    2. lower-*.f32N/A

      \[\leadsto \left(4 \cdot s + u \cdot \left(8 \cdot s + u \cdot \left(\frac{64}{3} \cdot s + 64 \cdot \left(s \cdot u\right)\right)\right)\right) \cdot \color{blue}{u} \]
  9. Applied rewrites93.4%

    \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(64, s \cdot u, 21.333333333333332 \cdot s\right), u, 8 \cdot s\right), u, s \cdot 4\right) \cdot u} \]
  10. Add Preprocessing

Alternative 3: 93.1% accurate, 4.3× speedup?

\[\begin{array}{l} \\ \left(\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(64, u, 21.333333333333332\right), u, 8\right), u, 4\right) \cdot u\right) \cdot s \end{array} \]
(FPCore (s u)
 :precision binary32
 (* (* (fma (fma (fma 64.0 u 21.333333333333332) u 8.0) u 4.0) u) s))
float code(float s, float u) {
	return (fmaf(fmaf(fmaf(64.0f, u, 21.333333333333332f), u, 8.0f), u, 4.0f) * u) * s;
}
function code(s, u)
	return Float32(Float32(fma(fma(fma(Float32(64.0), u, Float32(21.333333333333332)), u, Float32(8.0)), u, Float32(4.0)) * u) * s)
end
\begin{array}{l}

\\
\left(\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(64, u, 21.333333333333332\right), u, 8\right), u, 4\right) \cdot u\right) \cdot s
\end{array}
Derivation
  1. Initial program 61.0%

    \[s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \]
  2. Step-by-step derivation
    1. lift-*.f32N/A

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right) \cdot s} \]
    3. lower-*.f3261.0

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    5. lift-/.f32N/A

      \[\leadsto \log \color{blue}{\left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    6. log-recN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\log \left(1 - 4 \cdot u\right)\right)\right)} \cdot s \]
    7. lower-neg.f32N/A

      \[\leadsto \color{blue}{\left(-\log \left(1 - 4 \cdot u\right)\right)} \cdot s \]
    8. lift--.f32N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 - 4 \cdot u\right)}\right) \cdot s \]
    9. sub-negate1N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(4 \cdot u\right)\right)\right)}\right) \cdot s \]
    10. lower-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(4 \cdot u\right)\right)}\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{4 \cdot u}\right)\right)\right) \cdot s \]
    12. distribute-lft-neg-inN/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    14. metadata-eval99.4

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{-4} \cdot u\right)\right) \cdot s \]
  3. Applied rewrites99.4%

    \[\leadsto \color{blue}{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s} \]
  4. Step-by-step derivation
    1. lift-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\log \left(1 + -4 \cdot u\right)}\right) \cdot s \]
    2. flip-+N/A

      \[\leadsto \left(-\log \color{blue}{\left(\frac{1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}{1 - -4 \cdot u}\right)}\right) \cdot s \]
    3. log-divN/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    4. lower--.f32N/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    5. metadata-evalN/A

      \[\leadsto \left(-\left(\log \left(\color{blue}{1} - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    6. sub-negate1N/A

      \[\leadsto \left(-\left(\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    7. lower-log1p.f32N/A

      \[\leadsto \left(-\left(\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    8. lower-neg.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(\color{blue}{-\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    10. lower-pow.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(-4 \cdot u\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    14. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \log \left(1 - \color{blue}{-4 \cdot u}\right)\right)\right) \cdot s \]
    15. fp-cancel-sub-sign-invN/A

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

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \color{blue}{\mathsf{log1p}\left(\left(\mathsf{neg}\left(-4\right)\right) \cdot u\right)}\right)\right) \cdot s \]
    17. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(-4\right)\right) \cdot u}\right)\right)\right) \cdot s \]
    18. metadata-eval99.1

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{4} \cdot u\right)\right)\right) \cdot s \]
  5. Applied rewrites99.1%

    \[\leadsto \left(-\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right) \cdot s \]
  6. Step-by-step derivation
    1. lift-neg.f32N/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)\right)\right)} \cdot s \]
    2. lift--.f32N/A

      \[\leadsto \left(\mathsf{neg}\left(\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right)\right) \cdot s \]
    3. sub-negate2N/A

      \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right)\right)} \cdot s \]
    4. lower--.f3299.1

      \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right)\right)} \cdot s \]
    5. lift-neg.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\mathsf{neg}\left({\left(u \cdot -4\right)}^{2}\right)}\right)\right) \cdot s \]
    6. lift-pow.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{{\left(u \cdot -4\right)}^{2}}\right)\right)\right) \cdot s \]
    7. lift-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left({\color{blue}{\left(u \cdot -4\right)}}^{2}\right)\right)\right) \cdot s \]
    8. unpow-prod-downN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{{u}^{2} \cdot {-4}^{2}}\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{\left(u \cdot u\right)} \cdot {-4}^{2}\right)\right)\right) \cdot s \]
    10. lift-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{\left(u \cdot u\right)} \cdot {-4}^{2}\right)\right)\right) \cdot s \]
    11. metadata-evalN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\left(u \cdot u\right) \cdot \color{blue}{16}\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{16 \cdot \left(u \cdot u\right)}\right)\right)\right) \cdot s \]
    13. distribute-lft-neg-inN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(16\right)\right) \cdot \left(u \cdot u\right)}\right)\right) \cdot s \]
    14. lower-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(16\right)\right) \cdot \left(u \cdot u\right)}\right)\right) \cdot s \]
    15. metadata-eval99.1

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{-16} \cdot \left(u \cdot u\right)\right)\right) \cdot s \]
  7. Applied rewrites99.1%

    \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-16 \cdot \left(u \cdot u\right)\right)\right)} \cdot s \]
  8. Taylor expanded in u around 0

    \[\leadsto \color{blue}{\left(u \cdot \left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right)\right)} \cdot s \]
  9. Step-by-step derivation
    1. sub-negate2N/A

      \[\leadsto \left(\color{blue}{u} \cdot \left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right)\right) \cdot s \]
    2. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right)\right) \cdot s \]
    3. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right)\right) \cdot s \]
    4. +-commutativeN/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right)\right) \cdot s \]
    5. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right)\right) \cdot s \]
    6. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right)\right) \cdot s \]
    7. *-commutativeN/A

      \[\leadsto \left(\left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right) \cdot \color{blue}{u}\right) \cdot s \]
    8. lower-*.f32N/A

      \[\leadsto \left(\left(4 + u \cdot \left(8 + u \cdot \left(\frac{64}{3} + 64 \cdot u\right)\right)\right) \cdot \color{blue}{u}\right) \cdot s \]
  10. Applied rewrites93.1%

    \[\leadsto \color{blue}{\left(\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(64, u, 21.333333333333332\right), u, 8\right), u, 4\right) \cdot u\right)} \cdot s \]
  11. Add Preprocessing

Alternative 4: 91.0% accurate, 5.4× speedup?

\[\begin{array}{l} \\ \left(\mathsf{fma}\left(\mathsf{fma}\left(21.333333333333332, u, 8\right), u, 4\right) \cdot u\right) \cdot s \end{array} \]
(FPCore (s u)
 :precision binary32
 (* (* (fma (fma 21.333333333333332 u 8.0) u 4.0) u) s))
float code(float s, float u) {
	return (fmaf(fmaf(21.333333333333332f, u, 8.0f), u, 4.0f) * u) * s;
}
function code(s, u)
	return Float32(Float32(fma(fma(Float32(21.333333333333332), u, Float32(8.0)), u, Float32(4.0)) * u) * s)
end
\begin{array}{l}

\\
\left(\mathsf{fma}\left(\mathsf{fma}\left(21.333333333333332, u, 8\right), u, 4\right) \cdot u\right) \cdot s
\end{array}
Derivation
  1. Initial program 61.0%

    \[s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \]
  2. Step-by-step derivation
    1. lift-*.f32N/A

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right) \cdot s} \]
    3. lower-*.f3261.0

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    5. lift-/.f32N/A

      \[\leadsto \log \color{blue}{\left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    6. log-recN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\log \left(1 - 4 \cdot u\right)\right)\right)} \cdot s \]
    7. lower-neg.f32N/A

      \[\leadsto \color{blue}{\left(-\log \left(1 - 4 \cdot u\right)\right)} \cdot s \]
    8. lift--.f32N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 - 4 \cdot u\right)}\right) \cdot s \]
    9. sub-negate1N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(4 \cdot u\right)\right)\right)}\right) \cdot s \]
    10. lower-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(4 \cdot u\right)\right)}\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{4 \cdot u}\right)\right)\right) \cdot s \]
    12. distribute-lft-neg-inN/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    14. metadata-eval99.4

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{-4} \cdot u\right)\right) \cdot s \]
  3. Applied rewrites99.4%

    \[\leadsto \color{blue}{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s} \]
  4. Step-by-step derivation
    1. lift-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\log \left(1 + -4 \cdot u\right)}\right) \cdot s \]
    2. flip-+N/A

      \[\leadsto \left(-\log \color{blue}{\left(\frac{1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}{1 - -4 \cdot u}\right)}\right) \cdot s \]
    3. log-divN/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    4. lower--.f32N/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    5. metadata-evalN/A

      \[\leadsto \left(-\left(\log \left(\color{blue}{1} - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    6. sub-negate1N/A

      \[\leadsto \left(-\left(\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    7. lower-log1p.f32N/A

      \[\leadsto \left(-\left(\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    8. lower-neg.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(\color{blue}{-\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    10. lower-pow.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(-4 \cdot u\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    14. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \log \left(1 - \color{blue}{-4 \cdot u}\right)\right)\right) \cdot s \]
    15. fp-cancel-sub-sign-invN/A

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

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \color{blue}{\mathsf{log1p}\left(\left(\mathsf{neg}\left(-4\right)\right) \cdot u\right)}\right)\right) \cdot s \]
    17. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(-4\right)\right) \cdot u}\right)\right)\right) \cdot s \]
    18. metadata-eval99.1

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{4} \cdot u\right)\right)\right) \cdot s \]
  5. Applied rewrites99.1%

    \[\leadsto \left(-\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right) \cdot s \]
  6. Step-by-step derivation
    1. lift-neg.f32N/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)\right)\right)} \cdot s \]
    2. lift--.f32N/A

      \[\leadsto \left(\mathsf{neg}\left(\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right)\right) \cdot s \]
    3. sub-negate2N/A

      \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right)\right)} \cdot s \]
    4. lower--.f3299.1

      \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right)\right)} \cdot s \]
    5. lift-neg.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\mathsf{neg}\left({\left(u \cdot -4\right)}^{2}\right)}\right)\right) \cdot s \]
    6. lift-pow.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{{\left(u \cdot -4\right)}^{2}}\right)\right)\right) \cdot s \]
    7. lift-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left({\color{blue}{\left(u \cdot -4\right)}}^{2}\right)\right)\right) \cdot s \]
    8. unpow-prod-downN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{{u}^{2} \cdot {-4}^{2}}\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{\left(u \cdot u\right)} \cdot {-4}^{2}\right)\right)\right) \cdot s \]
    10. lift-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{\left(u \cdot u\right)} \cdot {-4}^{2}\right)\right)\right) \cdot s \]
    11. metadata-evalN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\left(u \cdot u\right) \cdot \color{blue}{16}\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{16 \cdot \left(u \cdot u\right)}\right)\right)\right) \cdot s \]
    13. distribute-lft-neg-inN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(16\right)\right) \cdot \left(u \cdot u\right)}\right)\right) \cdot s \]
    14. lower-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(16\right)\right) \cdot \left(u \cdot u\right)}\right)\right) \cdot s \]
    15. metadata-eval99.1

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{-16} \cdot \left(u \cdot u\right)\right)\right) \cdot s \]
  7. Applied rewrites99.1%

    \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-16 \cdot \left(u \cdot u\right)\right)\right)} \cdot s \]
  8. Taylor expanded in u around 0

    \[\leadsto \color{blue}{\left(u \cdot \left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right)\right)} \cdot s \]
  9. Step-by-step derivation
    1. sub-negate2N/A

      \[\leadsto \left(\color{blue}{u} \cdot \left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right)\right) \cdot s \]
    2. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right)\right) \cdot s \]
    3. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right)\right) \cdot s \]
    4. +-commutativeN/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right)\right) \cdot s \]
    5. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right)\right) \cdot s \]
    6. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right)\right) \cdot s \]
    7. *-commutativeN/A

      \[\leadsto \left(\left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right) \cdot \color{blue}{u}\right) \cdot s \]
    8. lower-*.f32N/A

      \[\leadsto \left(\left(4 + u \cdot \left(8 + \frac{64}{3} \cdot u\right)\right) \cdot \color{blue}{u}\right) \cdot s \]
    9. +-commutativeN/A

      \[\leadsto \left(\left(u \cdot \left(8 + \frac{64}{3} \cdot u\right) + 4\right) \cdot u\right) \cdot s \]
    10. *-commutativeN/A

      \[\leadsto \left(\left(\left(8 + \frac{64}{3} \cdot u\right) \cdot u + 4\right) \cdot u\right) \cdot s \]
    11. lower-fma.f32N/A

      \[\leadsto \left(\mathsf{fma}\left(8 + \frac{64}{3} \cdot u, u, 4\right) \cdot u\right) \cdot s \]
    12. +-commutativeN/A

      \[\leadsto \left(\mathsf{fma}\left(\frac{64}{3} \cdot u + 8, u, 4\right) \cdot u\right) \cdot s \]
    13. lower-fma.f3291.0

      \[\leadsto \left(\mathsf{fma}\left(\mathsf{fma}\left(21.333333333333332, u, 8\right), u, 4\right) \cdot u\right) \cdot s \]
  10. Applied rewrites91.0%

    \[\leadsto \color{blue}{\left(\mathsf{fma}\left(\mathsf{fma}\left(21.333333333333332, u, 8\right), u, 4\right) \cdot u\right)} \cdot s \]
  11. Add Preprocessing

Alternative 5: 86.9% accurate, 5.7× speedup?

\[\begin{array}{l} \\ \mathsf{fma}\left(8, s \cdot u, s \cdot 4\right) \cdot u \end{array} \]
(FPCore (s u) :precision binary32 (* (fma 8.0 (* s u) (* s 4.0)) u))
float code(float s, float u) {
	return fmaf(8.0f, (s * u), (s * 4.0f)) * u;
}
function code(s, u)
	return Float32(fma(Float32(8.0), Float32(s * u), Float32(s * Float32(4.0))) * u)
end
\begin{array}{l}

\\
\mathsf{fma}\left(8, s \cdot u, s \cdot 4\right) \cdot u
\end{array}
Derivation
  1. Initial program 61.0%

    \[s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \]
  2. Step-by-step derivation
    1. lift-*.f32N/A

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right) \cdot s} \]
    3. lower-*.f3261.0

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    5. lift-/.f32N/A

      \[\leadsto \log \color{blue}{\left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    6. log-recN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\log \left(1 - 4 \cdot u\right)\right)\right)} \cdot s \]
    7. lower-neg.f32N/A

      \[\leadsto \color{blue}{\left(-\log \left(1 - 4 \cdot u\right)\right)} \cdot s \]
    8. lift--.f32N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 - 4 \cdot u\right)}\right) \cdot s \]
    9. sub-negate1N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(4 \cdot u\right)\right)\right)}\right) \cdot s \]
    10. lower-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(4 \cdot u\right)\right)}\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{4 \cdot u}\right)\right)\right) \cdot s \]
    12. distribute-lft-neg-inN/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    14. metadata-eval99.4

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{-4} \cdot u\right)\right) \cdot s \]
  3. Applied rewrites99.4%

    \[\leadsto \color{blue}{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s} \]
  4. Step-by-step derivation
    1. lift-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\log \left(1 + -4 \cdot u\right)}\right) \cdot s \]
    2. flip-+N/A

      \[\leadsto \left(-\log \color{blue}{\left(\frac{1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}{1 - -4 \cdot u}\right)}\right) \cdot s \]
    3. log-divN/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    4. lower--.f32N/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    5. metadata-evalN/A

      \[\leadsto \left(-\left(\log \left(\color{blue}{1} - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    6. sub-negate1N/A

      \[\leadsto \left(-\left(\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    7. lower-log1p.f32N/A

      \[\leadsto \left(-\left(\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    8. lower-neg.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(\color{blue}{-\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    10. lower-pow.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(-4 \cdot u\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    14. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \log \left(1 - \color{blue}{-4 \cdot u}\right)\right)\right) \cdot s \]
    15. fp-cancel-sub-sign-invN/A

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

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \color{blue}{\mathsf{log1p}\left(\left(\mathsf{neg}\left(-4\right)\right) \cdot u\right)}\right)\right) \cdot s \]
    17. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(-4\right)\right) \cdot u}\right)\right)\right) \cdot s \]
    18. metadata-eval99.1

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{4} \cdot u\right)\right)\right) \cdot s \]
  5. Applied rewrites99.1%

    \[\leadsto \left(-\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right) \cdot s \]
  6. Applied rewrites74.6%

    \[\leadsto \color{blue}{\frac{{\left(\mathsf{log1p}\left(-4 \cdot u\right)\right)}^{4} \cdot s}{{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right)}^{3}}} \]
  7. Taylor expanded in u around 0

    \[\leadsto \color{blue}{u \cdot \left(4 \cdot s + 8 \cdot \left(s \cdot u\right)\right)} \]
  8. Step-by-step derivation
    1. *-commutativeN/A

      \[\leadsto \left(4 \cdot s + 8 \cdot \left(s \cdot u\right)\right) \cdot \color{blue}{u} \]
    2. lower-*.f32N/A

      \[\leadsto \left(4 \cdot s + 8 \cdot \left(s \cdot u\right)\right) \cdot \color{blue}{u} \]
    3. +-commutativeN/A

      \[\leadsto \left(8 \cdot \left(s \cdot u\right) + 4 \cdot s\right) \cdot u \]
    4. lower-fma.f32N/A

      \[\leadsto \mathsf{fma}\left(8, s \cdot u, 4 \cdot s\right) \cdot u \]
    5. lower-*.f32N/A

      \[\leadsto \mathsf{fma}\left(8, s \cdot u, 4 \cdot s\right) \cdot u \]
    6. *-commutativeN/A

      \[\leadsto \mathsf{fma}\left(8, s \cdot u, s \cdot 4\right) \cdot u \]
    7. lower-*.f3286.9

      \[\leadsto \mathsf{fma}\left(8, s \cdot u, s \cdot 4\right) \cdot u \]
  9. Applied rewrites86.9%

    \[\leadsto \color{blue}{\mathsf{fma}\left(8, s \cdot u, s \cdot 4\right) \cdot u} \]
  10. Add Preprocessing

Alternative 6: 86.8% accurate, 7.4× speedup?

\[\begin{array}{l} \\ \left(\mathsf{fma}\left(8, u, 4\right) \cdot u\right) \cdot s \end{array} \]
(FPCore (s u) :precision binary32 (* (* (fma 8.0 u 4.0) u) s))
float code(float s, float u) {
	return (fmaf(8.0f, u, 4.0f) * u) * s;
}
function code(s, u)
	return Float32(Float32(fma(Float32(8.0), u, Float32(4.0)) * u) * s)
end
\begin{array}{l}

\\
\left(\mathsf{fma}\left(8, u, 4\right) \cdot u\right) \cdot s
\end{array}
Derivation
  1. Initial program 61.0%

    \[s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \]
  2. Step-by-step derivation
    1. lift-*.f32N/A

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right) \cdot s} \]
    3. lower-*.f3261.0

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    5. lift-/.f32N/A

      \[\leadsto \log \color{blue}{\left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    6. log-recN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\log \left(1 - 4 \cdot u\right)\right)\right)} \cdot s \]
    7. lower-neg.f32N/A

      \[\leadsto \color{blue}{\left(-\log \left(1 - 4 \cdot u\right)\right)} \cdot s \]
    8. lift--.f32N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 - 4 \cdot u\right)}\right) \cdot s \]
    9. sub-negate1N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(4 \cdot u\right)\right)\right)}\right) \cdot s \]
    10. lower-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(4 \cdot u\right)\right)}\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{4 \cdot u}\right)\right)\right) \cdot s \]
    12. distribute-lft-neg-inN/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    14. metadata-eval99.4

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{-4} \cdot u\right)\right) \cdot s \]
  3. Applied rewrites99.4%

    \[\leadsto \color{blue}{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s} \]
  4. Step-by-step derivation
    1. lift-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\log \left(1 + -4 \cdot u\right)}\right) \cdot s \]
    2. flip-+N/A

      \[\leadsto \left(-\log \color{blue}{\left(\frac{1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}{1 - -4 \cdot u}\right)}\right) \cdot s \]
    3. log-divN/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    4. lower--.f32N/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    5. metadata-evalN/A

      \[\leadsto \left(-\left(\log \left(\color{blue}{1} - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    6. sub-negate1N/A

      \[\leadsto \left(-\left(\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    7. lower-log1p.f32N/A

      \[\leadsto \left(-\left(\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    8. lower-neg.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(\color{blue}{-\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    10. lower-pow.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(-4 \cdot u\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    14. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \log \left(1 - \color{blue}{-4 \cdot u}\right)\right)\right) \cdot s \]
    15. fp-cancel-sub-sign-invN/A

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

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \color{blue}{\mathsf{log1p}\left(\left(\mathsf{neg}\left(-4\right)\right) \cdot u\right)}\right)\right) \cdot s \]
    17. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(-4\right)\right) \cdot u}\right)\right)\right) \cdot s \]
    18. metadata-eval99.1

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{4} \cdot u\right)\right)\right) \cdot s \]
  5. Applied rewrites99.1%

    \[\leadsto \left(-\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right) \cdot s \]
  6. Step-by-step derivation
    1. lift-neg.f32N/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)\right)\right)} \cdot s \]
    2. lift--.f32N/A

      \[\leadsto \left(\mathsf{neg}\left(\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right)\right) \cdot s \]
    3. sub-negate2N/A

      \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right)\right)} \cdot s \]
    4. lower--.f3299.1

      \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right)\right)} \cdot s \]
    5. lift-neg.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\mathsf{neg}\left({\left(u \cdot -4\right)}^{2}\right)}\right)\right) \cdot s \]
    6. lift-pow.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{{\left(u \cdot -4\right)}^{2}}\right)\right)\right) \cdot s \]
    7. lift-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left({\color{blue}{\left(u \cdot -4\right)}}^{2}\right)\right)\right) \cdot s \]
    8. unpow-prod-downN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{{u}^{2} \cdot {-4}^{2}}\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{\left(u \cdot u\right)} \cdot {-4}^{2}\right)\right)\right) \cdot s \]
    10. lift-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{\left(u \cdot u\right)} \cdot {-4}^{2}\right)\right)\right) \cdot s \]
    11. metadata-evalN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\left(u \cdot u\right) \cdot \color{blue}{16}\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{16 \cdot \left(u \cdot u\right)}\right)\right)\right) \cdot s \]
    13. distribute-lft-neg-inN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(16\right)\right) \cdot \left(u \cdot u\right)}\right)\right) \cdot s \]
    14. lower-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(16\right)\right) \cdot \left(u \cdot u\right)}\right)\right) \cdot s \]
    15. metadata-eval99.1

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{-16} \cdot \left(u \cdot u\right)\right)\right) \cdot s \]
  7. Applied rewrites99.1%

    \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-16 \cdot \left(u \cdot u\right)\right)\right)} \cdot s \]
  8. Taylor expanded in u around 0

    \[\leadsto \color{blue}{\left(u \cdot \left(4 + 8 \cdot u\right)\right)} \cdot s \]
  9. Step-by-step derivation
    1. sub-negate2N/A

      \[\leadsto \left(\color{blue}{u} \cdot \left(4 + 8 \cdot u\right)\right) \cdot s \]
    2. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + 8 \cdot u\right)\right) \cdot s \]
    3. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + 8 \cdot u\right)\right) \cdot s \]
    4. +-commutativeN/A

      \[\leadsto \left(u \cdot \left(4 + 8 \cdot u\right)\right) \cdot s \]
    5. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + 8 \cdot u\right)\right) \cdot s \]
    6. lift-*.f32N/A

      \[\leadsto \left(u \cdot \left(4 + 8 \cdot u\right)\right) \cdot s \]
    7. *-commutativeN/A

      \[\leadsto \left(\left(4 + 8 \cdot u\right) \cdot \color{blue}{u}\right) \cdot s \]
    8. lower-*.f32N/A

      \[\leadsto \left(\left(4 + 8 \cdot u\right) \cdot \color{blue}{u}\right) \cdot s \]
    9. +-commutativeN/A

      \[\leadsto \left(\left(8 \cdot u + 4\right) \cdot u\right) \cdot s \]
    10. lower-fma.f3286.8

      \[\leadsto \left(\mathsf{fma}\left(8, u, 4\right) \cdot u\right) \cdot s \]
  10. Applied rewrites86.8%

    \[\leadsto \color{blue}{\left(\mathsf{fma}\left(8, u, 4\right) \cdot u\right)} \cdot s \]
  11. Add Preprocessing

Alternative 7: 74.0% accurate, 11.4× speedup?

\[\begin{array}{l} \\ \left(u \cdot 4\right) \cdot s \end{array} \]
(FPCore (s u) :precision binary32 (* (* u 4.0) s))
float code(float s, float u) {
	return (u * 4.0f) * s;
}
module fmin_fmax_functions
    implicit none
    private
    public fmax
    public fmin

    interface fmax
        module procedure fmax88
        module procedure fmax44
        module procedure fmax84
        module procedure fmax48
    end interface
    interface fmin
        module procedure fmin88
        module procedure fmin44
        module procedure fmin84
        module procedure fmin48
    end interface
contains
    real(8) function fmax88(x, y) result (res)
        real(8), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(x, max(x, y), y /= y), x /= x)
    end function
    real(4) function fmax44(x, y) result (res)
        real(4), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(y, merge(x, max(x, y), y /= y), x /= x)
    end function
    real(8) function fmax84(x, y) result(res)
        real(8), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(dble(y), merge(x, max(x, dble(y)), y /= y), x /= x)
    end function
    real(8) function fmax48(x, y) result(res)
        real(4), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(dble(x), max(dble(x), y), y /= y), x /= x)
    end function
    real(8) function fmin88(x, y) result (res)
        real(8), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(x, min(x, y), y /= y), x /= x)
    end function
    real(4) function fmin44(x, y) result (res)
        real(4), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(y, merge(x, min(x, y), y /= y), x /= x)
    end function
    real(8) function fmin84(x, y) result(res)
        real(8), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(dble(y), merge(x, min(x, dble(y)), y /= y), x /= x)
    end function
    real(8) function fmin48(x, y) result(res)
        real(4), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(dble(x), min(dble(x), y), y /= y), x /= x)
    end function
end module

real(4) function code(s, u)
use fmin_fmax_functions
    real(4), intent (in) :: s
    real(4), intent (in) :: u
    code = (u * 4.0e0) * s
end function
function code(s, u)
	return Float32(Float32(u * Float32(4.0)) * s)
end
function tmp = code(s, u)
	tmp = (u * single(4.0)) * s;
end
\begin{array}{l}

\\
\left(u \cdot 4\right) \cdot s
\end{array}
Derivation
  1. Initial program 61.0%

    \[s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \]
  2. Step-by-step derivation
    1. lift-*.f32N/A

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right) \cdot s} \]
    3. lower-*.f3261.0

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    5. lift-/.f32N/A

      \[\leadsto \log \color{blue}{\left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    6. log-recN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\log \left(1 - 4 \cdot u\right)\right)\right)} \cdot s \]
    7. lower-neg.f32N/A

      \[\leadsto \color{blue}{\left(-\log \left(1 - 4 \cdot u\right)\right)} \cdot s \]
    8. lift--.f32N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 - 4 \cdot u\right)}\right) \cdot s \]
    9. sub-negate1N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(4 \cdot u\right)\right)\right)}\right) \cdot s \]
    10. lower-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(4 \cdot u\right)\right)}\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{4 \cdot u}\right)\right)\right) \cdot s \]
    12. distribute-lft-neg-inN/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    14. metadata-eval99.4

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{-4} \cdot u\right)\right) \cdot s \]
  3. Applied rewrites99.4%

    \[\leadsto \color{blue}{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s} \]
  4. Step-by-step derivation
    1. lift-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\log \left(1 + -4 \cdot u\right)}\right) \cdot s \]
    2. flip-+N/A

      \[\leadsto \left(-\log \color{blue}{\left(\frac{1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}{1 - -4 \cdot u}\right)}\right) \cdot s \]
    3. log-divN/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    4. lower--.f32N/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    5. metadata-evalN/A

      \[\leadsto \left(-\left(\log \left(\color{blue}{1} - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    6. sub-negate1N/A

      \[\leadsto \left(-\left(\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    7. lower-log1p.f32N/A

      \[\leadsto \left(-\left(\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    8. lower-neg.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(\color{blue}{-\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    10. lower-pow.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(-4 \cdot u\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    14. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \log \left(1 - \color{blue}{-4 \cdot u}\right)\right)\right) \cdot s \]
    15. fp-cancel-sub-sign-invN/A

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

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \color{blue}{\mathsf{log1p}\left(\left(\mathsf{neg}\left(-4\right)\right) \cdot u\right)}\right)\right) \cdot s \]
    17. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(-4\right)\right) \cdot u}\right)\right)\right) \cdot s \]
    18. metadata-eval99.1

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{4} \cdot u\right)\right)\right) \cdot s \]
  5. Applied rewrites99.1%

    \[\leadsto \left(-\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right) \cdot s \]
  6. Step-by-step derivation
    1. lift-neg.f32N/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)\right)\right)} \cdot s \]
    2. lift--.f32N/A

      \[\leadsto \left(\mathsf{neg}\left(\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right)\right) \cdot s \]
    3. sub-negate2N/A

      \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right)\right)} \cdot s \]
    4. lower--.f3299.1

      \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right)\right)} \cdot s \]
    5. lift-neg.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\mathsf{neg}\left({\left(u \cdot -4\right)}^{2}\right)}\right)\right) \cdot s \]
    6. lift-pow.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{{\left(u \cdot -4\right)}^{2}}\right)\right)\right) \cdot s \]
    7. lift-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left({\color{blue}{\left(u \cdot -4\right)}}^{2}\right)\right)\right) \cdot s \]
    8. unpow-prod-downN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{{u}^{2} \cdot {-4}^{2}}\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{\left(u \cdot u\right)} \cdot {-4}^{2}\right)\right)\right) \cdot s \]
    10. lift-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{\left(u \cdot u\right)} \cdot {-4}^{2}\right)\right)\right) \cdot s \]
    11. metadata-evalN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\left(u \cdot u\right) \cdot \color{blue}{16}\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{16 \cdot \left(u \cdot u\right)}\right)\right)\right) \cdot s \]
    13. distribute-lft-neg-inN/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(16\right)\right) \cdot \left(u \cdot u\right)}\right)\right) \cdot s \]
    14. lower-*.f32N/A

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(16\right)\right) \cdot \left(u \cdot u\right)}\right)\right) \cdot s \]
    15. metadata-eval99.1

      \[\leadsto \left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(\color{blue}{-16} \cdot \left(u \cdot u\right)\right)\right) \cdot s \]
  7. Applied rewrites99.1%

    \[\leadsto \color{blue}{\left(\mathsf{log1p}\left(4 \cdot u\right) - \mathsf{log1p}\left(-16 \cdot \left(u \cdot u\right)\right)\right)} \cdot s \]
  8. Taylor expanded in u around 0

    \[\leadsto \color{blue}{\left(4 \cdot u\right)} \cdot s \]
  9. Step-by-step derivation
    1. sub-negate2N/A

      \[\leadsto \left(\color{blue}{4} \cdot u\right) \cdot s \]
    2. lift-*.f32N/A

      \[\leadsto \left(4 \cdot u\right) \cdot s \]
    3. lift-*.f32N/A

      \[\leadsto \left(4 \cdot u\right) \cdot s \]
    4. +-commutativeN/A

      \[\leadsto \left(4 \cdot u\right) \cdot s \]
    5. lift-*.f32N/A

      \[\leadsto \left(4 \cdot u\right) \cdot s \]
    6. lift-*.f32N/A

      \[\leadsto \left(4 \cdot u\right) \cdot s \]
    7. *-commutativeN/A

      \[\leadsto \left(u \cdot \color{blue}{4}\right) \cdot s \]
    8. lower-*.f3274.0

      \[\leadsto \left(u \cdot \color{blue}{4}\right) \cdot s \]
  10. Applied rewrites74.0%

    \[\leadsto \color{blue}{\left(u \cdot 4\right)} \cdot s \]
  11. Add Preprocessing

Alternative 8: 73.8% accurate, 11.4× speedup?

\[\begin{array}{l} \\ \left(s \cdot u\right) \cdot 4 \end{array} \]
(FPCore (s u) :precision binary32 (* (* s u) 4.0))
float code(float s, float u) {
	return (s * u) * 4.0f;
}
module fmin_fmax_functions
    implicit none
    private
    public fmax
    public fmin

    interface fmax
        module procedure fmax88
        module procedure fmax44
        module procedure fmax84
        module procedure fmax48
    end interface
    interface fmin
        module procedure fmin88
        module procedure fmin44
        module procedure fmin84
        module procedure fmin48
    end interface
contains
    real(8) function fmax88(x, y) result (res)
        real(8), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(x, max(x, y), y /= y), x /= x)
    end function
    real(4) function fmax44(x, y) result (res)
        real(4), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(y, merge(x, max(x, y), y /= y), x /= x)
    end function
    real(8) function fmax84(x, y) result(res)
        real(8), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(dble(y), merge(x, max(x, dble(y)), y /= y), x /= x)
    end function
    real(8) function fmax48(x, y) result(res)
        real(4), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(dble(x), max(dble(x), y), y /= y), x /= x)
    end function
    real(8) function fmin88(x, y) result (res)
        real(8), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(x, min(x, y), y /= y), x /= x)
    end function
    real(4) function fmin44(x, y) result (res)
        real(4), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(y, merge(x, min(x, y), y /= y), x /= x)
    end function
    real(8) function fmin84(x, y) result(res)
        real(8), intent (in) :: x
        real(4), intent (in) :: y
        res = merge(dble(y), merge(x, min(x, dble(y)), y /= y), x /= x)
    end function
    real(8) function fmin48(x, y) result(res)
        real(4), intent (in) :: x
        real(8), intent (in) :: y
        res = merge(y, merge(dble(x), min(dble(x), y), y /= y), x /= x)
    end function
end module

real(4) function code(s, u)
use fmin_fmax_functions
    real(4), intent (in) :: s
    real(4), intent (in) :: u
    code = (s * u) * 4.0e0
end function
function code(s, u)
	return Float32(Float32(s * u) * Float32(4.0))
end
function tmp = code(s, u)
	tmp = (s * u) * single(4.0);
end
\begin{array}{l}

\\
\left(s \cdot u\right) \cdot 4
\end{array}
Derivation
  1. Initial program 61.0%

    \[s \cdot \log \left(\frac{1}{1 - 4 \cdot u}\right) \]
  2. Step-by-step derivation
    1. lift-*.f32N/A

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right) \cdot s} \]
    3. lower-*.f3261.0

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

      \[\leadsto \color{blue}{\log \left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    5. lift-/.f32N/A

      \[\leadsto \log \color{blue}{\left(\frac{1}{1 - 4 \cdot u}\right)} \cdot s \]
    6. log-recN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\log \left(1 - 4 \cdot u\right)\right)\right)} \cdot s \]
    7. lower-neg.f32N/A

      \[\leadsto \color{blue}{\left(-\log \left(1 - 4 \cdot u\right)\right)} \cdot s \]
    8. lift--.f32N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 - 4 \cdot u\right)}\right) \cdot s \]
    9. sub-negate1N/A

      \[\leadsto \left(-\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(4 \cdot u\right)\right)\right)}\right) \cdot s \]
    10. lower-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(4 \cdot u\right)\right)}\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\mathsf{neg}\left(\color{blue}{4 \cdot u}\right)\right)\right) \cdot s \]
    12. distribute-lft-neg-inN/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(4\right)\right) \cdot u}\right)\right) \cdot s \]
    14. metadata-eval99.4

      \[\leadsto \left(-\mathsf{log1p}\left(\color{blue}{-4} \cdot u\right)\right) \cdot s \]
  3. Applied rewrites99.4%

    \[\leadsto \color{blue}{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right) \cdot s} \]
  4. Step-by-step derivation
    1. lift-log1p.f32N/A

      \[\leadsto \left(-\color{blue}{\log \left(1 + -4 \cdot u\right)}\right) \cdot s \]
    2. flip-+N/A

      \[\leadsto \left(-\log \color{blue}{\left(\frac{1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}{1 - -4 \cdot u}\right)}\right) \cdot s \]
    3. log-divN/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    4. lower--.f32N/A

      \[\leadsto \left(-\color{blue}{\left(\log \left(1 \cdot 1 - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)}\right) \cdot s \]
    5. metadata-evalN/A

      \[\leadsto \left(-\left(\log \left(\color{blue}{1} - \left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    6. sub-negate1N/A

      \[\leadsto \left(-\left(\log \color{blue}{\left(1 + \left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    7. lower-log1p.f32N/A

      \[\leadsto \left(-\left(\color{blue}{\mathsf{log1p}\left(\mathsf{neg}\left(\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)\right)\right)} - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    8. lower-neg.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(\color{blue}{-\left(-4 \cdot u\right) \cdot \left(-4 \cdot u\right)}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    9. pow2N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    10. lower-pow.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-\color{blue}{{\left(-4 \cdot u\right)}^{2}}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    11. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(-4 \cdot u\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    12. *-commutativeN/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    13. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\color{blue}{\left(u \cdot -4\right)}}^{2}\right) - \log \left(1 - -4 \cdot u\right)\right)\right) \cdot s \]
    14. lift-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \log \left(1 - \color{blue}{-4 \cdot u}\right)\right)\right) \cdot s \]
    15. fp-cancel-sub-sign-invN/A

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

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \color{blue}{\mathsf{log1p}\left(\left(\mathsf{neg}\left(-4\right)\right) \cdot u\right)}\right)\right) \cdot s \]
    17. lower-*.f32N/A

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{\left(\mathsf{neg}\left(-4\right)\right) \cdot u}\right)\right)\right) \cdot s \]
    18. metadata-eval99.1

      \[\leadsto \left(-\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(\color{blue}{4} \cdot u\right)\right)\right) \cdot s \]
  5. Applied rewrites99.1%

    \[\leadsto \left(-\color{blue}{\left(\mathsf{log1p}\left(-{\left(u \cdot -4\right)}^{2}\right) - \mathsf{log1p}\left(4 \cdot u\right)\right)}\right) \cdot s \]
  6. Applied rewrites74.6%

    \[\leadsto \color{blue}{\frac{{\left(\mathsf{log1p}\left(-4 \cdot u\right)\right)}^{4} \cdot s}{{\left(-\mathsf{log1p}\left(-4 \cdot u\right)\right)}^{3}}} \]
  7. Taylor expanded in u around 0

    \[\leadsto \color{blue}{4 \cdot \left(s \cdot u\right)} \]
  8. Step-by-step derivation
    1. *-commutativeN/A

      \[\leadsto \left(s \cdot u\right) \cdot \color{blue}{4} \]
    2. lower-*.f32N/A

      \[\leadsto \left(s \cdot u\right) \cdot \color{blue}{4} \]
    3. lower-*.f3273.8

      \[\leadsto \left(s \cdot u\right) \cdot 4 \]
  9. Applied rewrites73.8%

    \[\leadsto \color{blue}{\left(s \cdot u\right) \cdot 4} \]
  10. Add Preprocessing

Reproduce

?
herbie shell --seed 2025107 
(FPCore (s u)
  :name "Disney BSSRDF, sample scattering profile, lower"
  :precision binary32
  :pre (and (and (<= 0.0 s) (<= s 256.0)) (and (<= 2.328306437e-10 u) (<= u 0.25)))
  (* s (log (/ 1.0 (- 1.0 (* 4.0 u))))))