peicewise-defined

Percentage Accurate: 76.0% → 87.8%
Time: 3.3s
Alternatives: 5
Speedup: 1.6×

Specification

?
\[p \geq -1.79 \cdot 10^{+308} \land p \leq 1.79 \cdot 10^{+308}\]
\[\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1} \]
(FPCore (p)
  :precision binary64
  (- (+ p 1.0) (/ (pow (fmin p 0.0) 2.0) (- (fmin p 0.0) 1.0))))
double code(double p) {
	return (p + 1.0) - (pow(fmin(p, 0.0), 2.0) / (fmin(p, 0.0) - 1.0));
}
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(8) function code(p)
use fmin_fmax_functions
    real(8), intent (in) :: p
    code = (p + 1.0d0) - ((fmin(p, 0.0d0) ** 2.0d0) / (fmin(p, 0.0d0) - 1.0d0))
end function
public static double code(double p) {
	return (p + 1.0) - (Math.pow(fmin(p, 0.0), 2.0) / (fmin(p, 0.0) - 1.0));
}
def code(p):
	return (p + 1.0) - (math.pow(fmin(p, 0.0), 2.0) / (fmin(p, 0.0) - 1.0))
function code(p)
	return Float64(Float64(p + 1.0) - Float64((fmin(p, 0.0) ^ 2.0) / Float64(fmin(p, 0.0) - 1.0)))
end
function tmp = code(p)
	tmp = (p + 1.0) - ((min(p, 0.0) ^ 2.0) / (min(p, 0.0) - 1.0));
end
code[p_] := N[(N[(p + 1.0), $MachinePrecision] - N[(N[Power[N[Min[p, 0.0], $MachinePrecision], 2.0], $MachinePrecision] / N[(N[Min[p, 0.0], $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}

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

\[\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1} \]
(FPCore (p)
  :precision binary64
  (- (+ p 1.0) (/ (pow (fmin p 0.0) 2.0) (- (fmin p 0.0) 1.0))))
double code(double p) {
	return (p + 1.0) - (pow(fmin(p, 0.0), 2.0) / (fmin(p, 0.0) - 1.0));
}
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(8) function code(p)
use fmin_fmax_functions
    real(8), intent (in) :: p
    code = (p + 1.0d0) - ((fmin(p, 0.0d0) ** 2.0d0) / (fmin(p, 0.0d0) - 1.0d0))
end function
public static double code(double p) {
	return (p + 1.0) - (Math.pow(fmin(p, 0.0), 2.0) / (fmin(p, 0.0) - 1.0));
}
def code(p):
	return (p + 1.0) - (math.pow(fmin(p, 0.0), 2.0) / (fmin(p, 0.0) - 1.0))
function code(p)
	return Float64(Float64(p + 1.0) - Float64((fmin(p, 0.0) ^ 2.0) / Float64(fmin(p, 0.0) - 1.0)))
end
function tmp = code(p)
	tmp = (p + 1.0) - ((min(p, 0.0) ^ 2.0) / (min(p, 0.0) - 1.0));
end
code[p_] := N[(N[(p + 1.0), $MachinePrecision] - N[(N[Power[N[Min[p, 0.0], $MachinePrecision], 2.0], $MachinePrecision] / N[(N[Min[p, 0.0], $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}

Alternative 1: 87.8% accurate, 0.9× speedup?

\[\begin{array}{l} t_0 := \mathsf{min}\left(0, p\right) - 1\\ \frac{\left(\mathsf{fma}\left(t\_0, p, \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{t\_0} \end{array} \]
(FPCore (p)
  :precision binary64
  (let* ((t_0 (- (fmin 0.0 p) 1.0)))
  (/
   (- (- (fma t_0 p (fmin 0.0 p)) (* (fmin 0.0 p) (fmin 0.0 p))) 1.0)
   t_0)))
double code(double p) {
	double t_0 = fmin(0.0, p) - 1.0;
	return ((fma(t_0, p, fmin(0.0, p)) - (fmin(0.0, p) * fmin(0.0, p))) - 1.0) / t_0;
}
function code(p)
	t_0 = Float64(fmin(0.0, p) - 1.0)
	return Float64(Float64(Float64(fma(t_0, p, fmin(0.0, p)) - Float64(fmin(0.0, p) * fmin(0.0, p))) - 1.0) / t_0)
end
code[p_] := Block[{t$95$0 = N[(N[Min[0.0, p], $MachinePrecision] - 1.0), $MachinePrecision]}, N[(N[(N[(N[(t$95$0 * p + N[Min[0.0, p], $MachinePrecision]), $MachinePrecision] - N[(N[Min[0.0, p], $MachinePrecision] * N[Min[0.0, p], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - 1.0), $MachinePrecision] / t$95$0), $MachinePrecision]]
\begin{array}{l}
t_0 := \mathsf{min}\left(0, p\right) - 1\\
\frac{\left(\mathsf{fma}\left(t\_0, p, \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{t\_0}
\end{array}
Derivation
  1. Initial program 76.0%

    \[\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1} \]
  2. Step-by-step derivation
    1. lift--.f64N/A

      \[\leadsto \color{blue}{\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    2. lift-/.f64N/A

      \[\leadsto \left(p + 1\right) - \color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    3. sub-to-fractionN/A

      \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) - {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    4. lower-/.f64N/A

      \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) - {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
  3. Applied rewrites76.1%

    \[\leadsto \color{blue}{\frac{\left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
  4. Step-by-step derivation
    1. lift--.f64N/A

      \[\leadsto \frac{\color{blue}{\left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}}{\mathsf{min}\left(0, p\right) - 1} \]
    2. sub-flipN/A

      \[\leadsto \frac{\color{blue}{\left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right) + \left(\mathsf{neg}\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right)\right)}}{\mathsf{min}\left(0, p\right) - 1} \]
    3. +-commutativeN/A

      \[\leadsto \frac{\color{blue}{\left(\mathsf{neg}\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right)\right) + \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}}{\mathsf{min}\left(0, p\right) - 1} \]
    4. lift-*.f64N/A

      \[\leadsto \frac{\left(\mathsf{neg}\left(\color{blue}{\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}\right)\right) + \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    5. distribute-rgt-neg-inN/A

      \[\leadsto \frac{\color{blue}{\mathsf{min}\left(0, p\right) \cdot \left(\mathsf{neg}\left(\mathsf{min}\left(0, p\right)\right)\right)} + \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    6. lower-fma.f64N/A

      \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(\mathsf{min}\left(0, p\right), \mathsf{neg}\left(\mathsf{min}\left(0, p\right)\right), \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}}{\mathsf{min}\left(0, p\right) - 1} \]
    7. lift-fmin.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(\color{blue}{\mathsf{min}\left(0, p\right)}, \mathsf{neg}\left(\mathsf{min}\left(0, p\right)\right), \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    8. fmin-swapN/A

      \[\leadsto \frac{\mathsf{fma}\left(\color{blue}{\mathsf{min}\left(p, 0\right)}, \mathsf{neg}\left(\mathsf{min}\left(0, p\right)\right), \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    9. lift-fmin.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(\color{blue}{\mathsf{min}\left(p, 0\right)}, \mathsf{neg}\left(\mathsf{min}\left(0, p\right)\right), \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    10. lower-neg.f6476.0%

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), \color{blue}{-\mathsf{min}\left(0, p\right)}, \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    11. lift-fmin.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\color{blue}{\mathsf{min}\left(0, p\right)}, \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    12. fmin-swapN/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\color{blue}{\mathsf{min}\left(p, 0\right)}, \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    13. lift-fmin.f6476.0%

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\color{blue}{\mathsf{min}\left(p, 0\right)}, \left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    14. lift-*.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \color{blue}{\left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    15. lift--.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \color{blue}{\left(-1 - p\right)} \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    16. sub-negate-revN/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \color{blue}{\left(\mathsf{neg}\left(\left(p - -1\right)\right)\right)} \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    17. metadata-evalN/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \left(\mathsf{neg}\left(\left(p - \color{blue}{\left(\mathsf{neg}\left(1\right)\right)}\right)\right)\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    18. add-flipN/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \left(\mathsf{neg}\left(\color{blue}{\left(p + 1\right)}\right)\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    19. lift-+.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \left(\mathsf{neg}\left(\color{blue}{\left(p + 1\right)}\right)\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    20. distribute-lft-neg-outN/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \color{blue}{\mathsf{neg}\left(\left(p + 1\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    21. distribute-rgt-neg-outN/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \color{blue}{\left(p + 1\right) \cdot \left(\mathsf{neg}\left(\left(1 - \mathsf{min}\left(0, p\right)\right)\right)\right)}\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    22. lift--.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \left(p + 1\right) \cdot \left(\mathsf{neg}\left(\color{blue}{\left(1 - \mathsf{min}\left(0, p\right)\right)}\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    23. sub-negate-revN/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \left(p + 1\right) \cdot \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right)}\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    24. lift--.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \left(p + 1\right) \cdot \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right)}\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    25. lower-*.f6476.0%

      \[\leadsto \frac{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \color{blue}{\left(p + 1\right) \cdot \left(\mathsf{min}\left(0, p\right) - 1\right)}\right)}{\mathsf{min}\left(0, p\right) - 1} \]
  5. Applied rewrites76.0%

    \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), -\mathsf{min}\left(p, 0\right), \left(p - -1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}}{\mathsf{min}\left(0, p\right) - 1} \]
  6. Taylor expanded in p around 0

    \[\leadsto \frac{\color{blue}{\left(-1 \cdot {\left(\mathsf{min}\left(p, 0\right)\right)}^{2} + \left(p \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) + \mathsf{min}\left(p, 0\right)\right)\right) - 1}}{\mathsf{min}\left(0, p\right) - 1} \]
  7. Step-by-step derivation
    1. lower--.f64N/A

      \[\leadsto \frac{\left(-1 \cdot {\left(\mathsf{min}\left(p, 0\right)\right)}^{2} + \left(p \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) + \mathsf{min}\left(p, 0\right)\right)\right) - \color{blue}{1}}{\mathsf{min}\left(0, p\right) - 1} \]
    2. lower-fma.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(-1, {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}, p \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) + \mathsf{min}\left(p, 0\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    3. lower-pow.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(-1, {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}, p \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) + \mathsf{min}\left(p, 0\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    4. lower-fmin.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(-1, {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}, p \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) + \mathsf{min}\left(p, 0\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    5. lower-fma.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(-1, {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}, \mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    6. lower--.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(-1, {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}, \mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    7. lower-fmin.f64N/A

      \[\leadsto \frac{\mathsf{fma}\left(-1, {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}, \mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    8. lower-fmin.f6487.7%

      \[\leadsto \frac{\mathsf{fma}\left(-1, {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}, \mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
  8. Applied rewrites87.7%

    \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(-1, {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}, \mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right)\right) - 1}}{\mathsf{min}\left(0, p\right) - 1} \]
  9. Step-by-step derivation
    1. lift-fma.f64N/A

      \[\leadsto \frac{\left(-1 \cdot {\left(\mathsf{min}\left(p, 0\right)\right)}^{2} + \mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    2. +-commutativeN/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) + -1 \cdot {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    3. mul-1-negN/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) + \left(\mathsf{neg}\left({\left(\mathsf{min}\left(p, 0\right)\right)}^{2}\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    4. lift-pow.f64N/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) + \left(\mathsf{neg}\left({\left(\mathsf{min}\left(p, 0\right)\right)}^{2}\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    5. lift-fmin.f64N/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) + \left(\mathsf{neg}\left({\left(\mathsf{min}\left(p, 0\right)\right)}^{2}\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    6. fmin-swapN/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) + \left(\mathsf{neg}\left({\left(\mathsf{min}\left(0, p\right)\right)}^{2}\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    7. lift-fmin.f64N/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) + \left(\mathsf{neg}\left({\left(\mathsf{min}\left(0, p\right)\right)}^{2}\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    8. pow2N/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) + \left(\mathsf{neg}\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    9. lift-*.f64N/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) + \left(\mathsf{neg}\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right)\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    10. sub-flip-reverseN/A

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    11. lower--.f6487.8%

      \[\leadsto \frac{\left(\mathsf{fma}\left(p, \mathsf{min}\left(p, 0\right) - 1, \mathsf{min}\left(p, 0\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    12. lift-fma.f64N/A

      \[\leadsto \frac{\left(\left(p \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) + \mathsf{min}\left(p, 0\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    13. *-commutativeN/A

      \[\leadsto \frac{\left(\left(\left(\mathsf{min}\left(p, 0\right) - 1\right) \cdot p + \mathsf{min}\left(p, 0\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    14. lift-fmin.f64N/A

      \[\leadsto \frac{\left(\left(\left(\mathsf{min}\left(p, 0\right) - 1\right) \cdot p + \mathsf{min}\left(p, 0\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    15. fmin-swapN/A

      \[\leadsto \frac{\left(\left(\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p + \mathsf{min}\left(p, 0\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    16. lift-fmin.f64N/A

      \[\leadsto \frac{\left(\left(\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p + \mathsf{min}\left(p, 0\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    17. lift-fmin.f64N/A

      \[\leadsto \frac{\left(\left(\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p + \mathsf{min}\left(p, 0\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    18. fmin-swapN/A

      \[\leadsto \frac{\left(\left(\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p + \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    19. lift-fmin.f64N/A

      \[\leadsto \frac{\left(\left(\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p + \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
    20. lower-fma.f6487.8%

      \[\leadsto \frac{\left(\mathsf{fma}\left(\mathsf{min}\left(0, p\right) - 1, p, \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
  10. Applied rewrites87.8%

    \[\leadsto \frac{\left(\mathsf{fma}\left(\mathsf{min}\left(0, p\right) - 1, p, \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) - 1}{\mathsf{min}\left(0, p\right) - 1} \]
  11. Add Preprocessing

Alternative 2: 76.7% accurate, 1.5× speedup?

\[\mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}, p - -1\right) \]
(FPCore (p)
  :precision binary64
  (fma (fmin 0.0 p) (/ (fmin 0.0 p) (- 1.0 (fmin 0.0 p))) (- p -1.0)))
double code(double p) {
	return fma(fmin(0.0, p), (fmin(0.0, p) / (1.0 - fmin(0.0, p))), (p - -1.0));
}
function code(p)
	return fma(fmin(0.0, p), Float64(fmin(0.0, p) / Float64(1.0 - fmin(0.0, p))), Float64(p - -1.0))
end
code[p_] := N[(N[Min[0.0, p], $MachinePrecision] * N[(N[Min[0.0, p], $MachinePrecision] / N[(1.0 - N[Min[0.0, p], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(p - -1.0), $MachinePrecision]), $MachinePrecision]
\mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}, p - -1\right)
Derivation
  1. Initial program 76.0%

    \[\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1} \]
  2. Step-by-step derivation
    1. lift--.f64N/A

      \[\leadsto \color{blue}{\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    2. sub-flipN/A

      \[\leadsto \color{blue}{\left(p + 1\right) + \left(\mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right)} \]
    3. +-commutativeN/A

      \[\leadsto \color{blue}{\left(\mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right) + \left(p + 1\right)} \]
    4. lift-/.f64N/A

      \[\leadsto \left(\mathsf{neg}\left(\color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}}\right)\right) + \left(p + 1\right) \]
    5. distribute-neg-frac2N/A

      \[\leadsto \color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}} + \left(p + 1\right) \]
    6. lift-pow.f64N/A

      \[\leadsto \frac{\color{blue}{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)} + \left(p + 1\right) \]
    7. unpow2N/A

      \[\leadsto \frac{\color{blue}{\mathsf{min}\left(p, 0\right) \cdot \mathsf{min}\left(p, 0\right)}}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)} + \left(p + 1\right) \]
    8. associate-/l*N/A

      \[\leadsto \color{blue}{\mathsf{min}\left(p, 0\right) \cdot \frac{\mathsf{min}\left(p, 0\right)}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}} + \left(p + 1\right) \]
    9. lower-fma.f64N/A

      \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), \frac{\mathsf{min}\left(p, 0\right)}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}, p + 1\right)} \]
    10. lift-fmin.f64N/A

      \[\leadsto \mathsf{fma}\left(\color{blue}{\mathsf{min}\left(p, 0\right)}, \frac{\mathsf{min}\left(p, 0\right)}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}, p + 1\right) \]
    11. fmin-swapN/A

      \[\leadsto \mathsf{fma}\left(\color{blue}{\mathsf{min}\left(0, p\right)}, \frac{\mathsf{min}\left(p, 0\right)}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}, p + 1\right) \]
    12. lower-fmin.f64N/A

      \[\leadsto \mathsf{fma}\left(\color{blue}{\mathsf{min}\left(0, p\right)}, \frac{\mathsf{min}\left(p, 0\right)}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}, p + 1\right) \]
    13. lower-/.f64N/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \color{blue}{\frac{\mathsf{min}\left(p, 0\right)}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}}, p + 1\right) \]
    14. lift-fmin.f64N/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\color{blue}{\mathsf{min}\left(p, 0\right)}}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}, p + 1\right) \]
    15. fmin-swapN/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\color{blue}{\mathsf{min}\left(0, p\right)}}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}, p + 1\right) \]
    16. lower-fmin.f64N/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\color{blue}{\mathsf{min}\left(0, p\right)}}{\mathsf{neg}\left(\left(\mathsf{min}\left(p, 0\right) - 1\right)\right)}, p + 1\right) \]
    17. lift--.f64N/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{\mathsf{neg}\left(\color{blue}{\left(\mathsf{min}\left(p, 0\right) - 1\right)}\right)}, p + 1\right) \]
    18. sub-negate-revN/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{\color{blue}{1 - \mathsf{min}\left(p, 0\right)}}, p + 1\right) \]
    19. lower--.f6476.7%

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{\color{blue}{1 - \mathsf{min}\left(p, 0\right)}}, p + 1\right) \]
    20. lift-fmin.f64N/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \color{blue}{\mathsf{min}\left(p, 0\right)}}, p + 1\right) \]
    21. fmin-swapN/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \color{blue}{\mathsf{min}\left(0, p\right)}}, p + 1\right) \]
    22. lower-fmin.f6476.7%

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \color{blue}{\mathsf{min}\left(0, p\right)}}, p + 1\right) \]
    23. lift-+.f64N/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}, \color{blue}{p + 1}\right) \]
    24. add-flipN/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}, \color{blue}{p - \left(\mathsf{neg}\left(1\right)\right)}\right) \]
    25. lower--.f64N/A

      \[\leadsto \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}, \color{blue}{p - \left(\mathsf{neg}\left(1\right)\right)}\right) \]
  3. Applied rewrites76.7%

    \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}, p - -1\right)} \]
  4. Add Preprocessing

Alternative 3: 76.7% accurate, 1.6× speedup?

\[p - \left(\frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}} - 1\right) \]
(FPCore (p)
  :precision binary64
  (- p (- (/ (fmin 0.0 p) (- 1.0 (/ 1.0 (fmin 0.0 p)))) 1.0)))
double code(double p) {
	return p - ((fmin(0.0, p) / (1.0 - (1.0 / fmin(0.0, p)))) - 1.0);
}
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(8) function code(p)
use fmin_fmax_functions
    real(8), intent (in) :: p
    code = p - ((fmin(0.0d0, p) / (1.0d0 - (1.0d0 / fmin(0.0d0, p)))) - 1.0d0)
end function
public static double code(double p) {
	return p - ((fmin(0.0, p) / (1.0 - (1.0 / fmin(0.0, p)))) - 1.0);
}
def code(p):
	return p - ((fmin(0.0, p) / (1.0 - (1.0 / fmin(0.0, p)))) - 1.0)
function code(p)
	return Float64(p - Float64(Float64(fmin(0.0, p) / Float64(1.0 - Float64(1.0 / fmin(0.0, p)))) - 1.0))
end
function tmp = code(p)
	tmp = p - ((min(0.0, p) / (1.0 - (1.0 / min(0.0, p)))) - 1.0);
end
code[p_] := N[(p - N[(N[(N[Min[0.0, p], $MachinePrecision] / N[(1.0 - N[(1.0 / N[Min[0.0, p], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]
p - \left(\frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}} - 1\right)
Derivation
  1. Initial program 76.0%

    \[\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1} \]
  2. Step-by-step derivation
    1. lift--.f64N/A

      \[\leadsto \color{blue}{\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    2. lift-/.f64N/A

      \[\leadsto \left(p + 1\right) - \color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    3. sub-to-fractionN/A

      \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) - {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    4. div-subN/A

      \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right)}{\mathsf{min}\left(p, 0\right) - 1} - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    5. lift-/.f64N/A

      \[\leadsto \frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right)}{\mathsf{min}\left(p, 0\right) - 1} - \color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    6. sub-flipN/A

      \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right)}{\mathsf{min}\left(p, 0\right) - 1} + \left(\mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right)} \]
    7. *-commutativeN/A

      \[\leadsto \frac{\color{blue}{\left(\mathsf{min}\left(p, 0\right) - 1\right) \cdot \left(p + 1\right)}}{\mathsf{min}\left(p, 0\right) - 1} + \left(\mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right) \]
    8. associate-/l*N/A

      \[\leadsto \color{blue}{\left(\mathsf{min}\left(p, 0\right) - 1\right) \cdot \frac{p + 1}{\mathsf{min}\left(p, 0\right) - 1}} + \left(\mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right) \]
    9. lower-fma.f64N/A

      \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right) - 1, \frac{p + 1}{\mathsf{min}\left(p, 0\right) - 1}, \mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right)} \]
  3. Applied rewrites76.7%

    \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{min}\left(0, p\right) - 1, \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)}, \mathsf{min}\left(0, p\right) \cdot \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}\right)} \]
  4. Step-by-step derivation
    1. lift-fma.f64N/A

      \[\leadsto \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \mathsf{min}\left(0, p\right) \cdot \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
    2. lift-*.f64N/A

      \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \color{blue}{\mathsf{min}\left(0, p\right) \cdot \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
    3. lift-/.f64N/A

      \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \mathsf{min}\left(0, p\right) \cdot \color{blue}{\frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
    4. associate-*r/N/A

      \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \color{blue}{\frac{\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
    5. lift-*.f64N/A

      \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \frac{\color{blue}{\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}}{1 - \mathsf{min}\left(0, p\right)} \]
    6. mult-flipN/A

      \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \color{blue}{\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) \cdot \frac{1}{1 - \mathsf{min}\left(0, p\right)}} \]
    7. fp-cancel-sign-sub-invN/A

      \[\leadsto \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} - \left(\mathsf{neg}\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right)\right) \cdot \frac{1}{1 - \mathsf{min}\left(0, p\right)}} \]
    8. mult-flipN/A

      \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} - \color{blue}{\frac{\mathsf{neg}\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
  5. Applied rewrites76.7%

    \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), \frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)}, p - -1\right)} \]
  6. Step-by-step derivation
    1. lift-fma.f64N/A

      \[\leadsto \color{blue}{\mathsf{min}\left(p, 0\right) \cdot \frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)} + \left(p - -1\right)} \]
    2. +-commutativeN/A

      \[\leadsto \color{blue}{\left(p - -1\right) + \mathsf{min}\left(p, 0\right) \cdot \frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)}} \]
    3. *-commutativeN/A

      \[\leadsto \left(p - -1\right) + \color{blue}{\frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)} \cdot \mathsf{min}\left(p, 0\right)} \]
    4. fp-cancel-sign-sub-invN/A

      \[\leadsto \color{blue}{\left(p - -1\right) - \left(\mathsf{neg}\left(\frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)}\right)\right) \cdot \mathsf{min}\left(p, 0\right)} \]
    5. lift--.f64N/A

      \[\leadsto \color{blue}{\left(p - -1\right)} - \left(\mathsf{neg}\left(\frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)}\right)\right) \cdot \mathsf{min}\left(p, 0\right) \]
    6. lift-/.f64N/A

      \[\leadsto \left(p - -1\right) - \left(\mathsf{neg}\left(\color{blue}{\frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)}}\right)\right) \cdot \mathsf{min}\left(p, 0\right) \]
    7. distribute-frac-neg2N/A

      \[\leadsto \left(p - -1\right) - \color{blue}{\frac{\mathsf{min}\left(p, 0\right)}{\mathsf{neg}\left(\left(1 - \mathsf{min}\left(p, 0\right)\right)\right)}} \cdot \mathsf{min}\left(p, 0\right) \]
    8. lift--.f64N/A

      \[\leadsto \left(p - -1\right) - \frac{\mathsf{min}\left(p, 0\right)}{\mathsf{neg}\left(\color{blue}{\left(1 - \mathsf{min}\left(p, 0\right)\right)}\right)} \cdot \mathsf{min}\left(p, 0\right) \]
    9. sub-negate-revN/A

      \[\leadsto \left(p - -1\right) - \frac{\mathsf{min}\left(p, 0\right)}{\color{blue}{\mathsf{min}\left(p, 0\right) - 1}} \cdot \mathsf{min}\left(p, 0\right) \]
    10. lift--.f64N/A

      \[\leadsto \left(p - -1\right) - \frac{\mathsf{min}\left(p, 0\right)}{\color{blue}{\mathsf{min}\left(p, 0\right) - 1}} \cdot \mathsf{min}\left(p, 0\right) \]
    11. div-flip-revN/A

      \[\leadsto \left(p - -1\right) - \color{blue}{\frac{1}{\frac{\mathsf{min}\left(p, 0\right) - 1}{\mathsf{min}\left(p, 0\right)}}} \cdot \mathsf{min}\left(p, 0\right) \]
    12. lift-/.f64N/A

      \[\leadsto \left(p - -1\right) - \frac{1}{\color{blue}{\frac{\mathsf{min}\left(p, 0\right) - 1}{\mathsf{min}\left(p, 0\right)}}} \cdot \mathsf{min}\left(p, 0\right) \]
    13. lift-/.f64N/A

      \[\leadsto \left(p - -1\right) - \color{blue}{\frac{1}{\frac{\mathsf{min}\left(p, 0\right) - 1}{\mathsf{min}\left(p, 0\right)}}} \cdot \mathsf{min}\left(p, 0\right) \]
    14. lift-fmin.f64N/A

      \[\leadsto \left(p - -1\right) - \frac{1}{\frac{\mathsf{min}\left(p, 0\right) - 1}{\mathsf{min}\left(p, 0\right)}} \cdot \color{blue}{\mathsf{min}\left(p, 0\right)} \]
    15. fmin-swapN/A

      \[\leadsto \left(p - -1\right) - \frac{1}{\frac{\mathsf{min}\left(p, 0\right) - 1}{\mathsf{min}\left(p, 0\right)}} \cdot \color{blue}{\mathsf{min}\left(0, p\right)} \]
    16. lift-fmin.f64N/A

      \[\leadsto \left(p - -1\right) - \frac{1}{\frac{\mathsf{min}\left(p, 0\right) - 1}{\mathsf{min}\left(p, 0\right)}} \cdot \color{blue}{\mathsf{min}\left(0, p\right)} \]
    17. associate--r+N/A

      \[\leadsto \color{blue}{p - \left(-1 + \frac{1}{\frac{\mathsf{min}\left(p, 0\right) - 1}{\mathsf{min}\left(p, 0\right)}} \cdot \mathsf{min}\left(0, p\right)\right)} \]
  7. Applied rewrites76.7%

    \[\leadsto \color{blue}{p - \left(\frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}} - 1\right)} \]
  8. Add Preprocessing

Alternative 4: 74.4% accurate, 1.5× speedup?

\[\begin{array}{l} t_0 := \mathsf{min}\left(0, p\right) - 1\\ \mathbf{if}\;p \leq 35:\\ \;\;\;\;1 - \frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{t\_0 \cdot p}{t\_0}\\ \end{array} \]
(FPCore (p)
  :precision binary64
  (let* ((t_0 (- (fmin 0.0 p) 1.0)))
  (if (<= p 35.0)
    (- 1.0 (/ (fmin 0.0 p) (- 1.0 (/ 1.0 (fmin 0.0 p)))))
    (/ (* t_0 p) t_0))))
double code(double p) {
	double t_0 = fmin(0.0, p) - 1.0;
	double tmp;
	if (p <= 35.0) {
		tmp = 1.0 - (fmin(0.0, p) / (1.0 - (1.0 / fmin(0.0, p))));
	} else {
		tmp = (t_0 * p) / t_0;
	}
	return tmp;
}
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(8) function code(p)
use fmin_fmax_functions
    real(8), intent (in) :: p
    real(8) :: t_0
    real(8) :: tmp
    t_0 = fmin(0.0d0, p) - 1.0d0
    if (p <= 35.0d0) then
        tmp = 1.0d0 - (fmin(0.0d0, p) / (1.0d0 - (1.0d0 / fmin(0.0d0, p))))
    else
        tmp = (t_0 * p) / t_0
    end if
    code = tmp
end function
public static double code(double p) {
	double t_0 = fmin(0.0, p) - 1.0;
	double tmp;
	if (p <= 35.0) {
		tmp = 1.0 - (fmin(0.0, p) / (1.0 - (1.0 / fmin(0.0, p))));
	} else {
		tmp = (t_0 * p) / t_0;
	}
	return tmp;
}
def code(p):
	t_0 = fmin(0.0, p) - 1.0
	tmp = 0
	if p <= 35.0:
		tmp = 1.0 - (fmin(0.0, p) / (1.0 - (1.0 / fmin(0.0, p))))
	else:
		tmp = (t_0 * p) / t_0
	return tmp
function code(p)
	t_0 = Float64(fmin(0.0, p) - 1.0)
	tmp = 0.0
	if (p <= 35.0)
		tmp = Float64(1.0 - Float64(fmin(0.0, p) / Float64(1.0 - Float64(1.0 / fmin(0.0, p)))));
	else
		tmp = Float64(Float64(t_0 * p) / t_0);
	end
	return tmp
end
function tmp_2 = code(p)
	t_0 = min(0.0, p) - 1.0;
	tmp = 0.0;
	if (p <= 35.0)
		tmp = 1.0 - (min(0.0, p) / (1.0 - (1.0 / min(0.0, p))));
	else
		tmp = (t_0 * p) / t_0;
	end
	tmp_2 = tmp;
end
code[p_] := Block[{t$95$0 = N[(N[Min[0.0, p], $MachinePrecision] - 1.0), $MachinePrecision]}, If[LessEqual[p, 35.0], N[(1.0 - N[(N[Min[0.0, p], $MachinePrecision] / N[(1.0 - N[(1.0 / N[Min[0.0, p], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[(t$95$0 * p), $MachinePrecision] / t$95$0), $MachinePrecision]]]
\begin{array}{l}
t_0 := \mathsf{min}\left(0, p\right) - 1\\
\mathbf{if}\;p \leq 35:\\
\;\;\;\;1 - \frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}}\\

\mathbf{else}:\\
\;\;\;\;\frac{t\_0 \cdot p}{t\_0}\\


\end{array}
Derivation
  1. Split input into 2 regimes
  2. if p < 35

    1. Initial program 76.0%

      \[\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1} \]
    2. Step-by-step derivation
      1. lift--.f64N/A

        \[\leadsto \color{blue}{\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
      2. lift-/.f64N/A

        \[\leadsto \left(p + 1\right) - \color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
      3. sub-to-fractionN/A

        \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) - {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
      4. div-subN/A

        \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right)}{\mathsf{min}\left(p, 0\right) - 1} - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
      5. lift-/.f64N/A

        \[\leadsto \frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right)}{\mathsf{min}\left(p, 0\right) - 1} - \color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
      6. sub-flipN/A

        \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right)}{\mathsf{min}\left(p, 0\right) - 1} + \left(\mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right)} \]
      7. *-commutativeN/A

        \[\leadsto \frac{\color{blue}{\left(\mathsf{min}\left(p, 0\right) - 1\right) \cdot \left(p + 1\right)}}{\mathsf{min}\left(p, 0\right) - 1} + \left(\mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right) \]
      8. associate-/l*N/A

        \[\leadsto \color{blue}{\left(\mathsf{min}\left(p, 0\right) - 1\right) \cdot \frac{p + 1}{\mathsf{min}\left(p, 0\right) - 1}} + \left(\mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right) \]
      9. lower-fma.f64N/A

        \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right) - 1, \frac{p + 1}{\mathsf{min}\left(p, 0\right) - 1}, \mathsf{neg}\left(\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}\right)\right)} \]
    3. Applied rewrites76.7%

      \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{min}\left(0, p\right) - 1, \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)}, \mathsf{min}\left(0, p\right) \cdot \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}\right)} \]
    4. Step-by-step derivation
      1. lift-fma.f64N/A

        \[\leadsto \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \mathsf{min}\left(0, p\right) \cdot \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
      2. lift-*.f64N/A

        \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \color{blue}{\mathsf{min}\left(0, p\right) \cdot \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
      3. lift-/.f64N/A

        \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \mathsf{min}\left(0, p\right) \cdot \color{blue}{\frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
      4. associate-*r/N/A

        \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \color{blue}{\frac{\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
      5. lift-*.f64N/A

        \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \frac{\color{blue}{\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}}{1 - \mathsf{min}\left(0, p\right)} \]
      6. mult-flipN/A

        \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} + \color{blue}{\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right) \cdot \frac{1}{1 - \mathsf{min}\left(0, p\right)}} \]
      7. fp-cancel-sign-sub-invN/A

        \[\leadsto \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} - \left(\mathsf{neg}\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right)\right) \cdot \frac{1}{1 - \mathsf{min}\left(0, p\right)}} \]
      8. mult-flipN/A

        \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \frac{-1 - p}{1 - \mathsf{min}\left(0, p\right)} - \color{blue}{\frac{\mathsf{neg}\left(\mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)\right)}{1 - \mathsf{min}\left(0, p\right)}} \]
    5. Applied rewrites76.7%

      \[\leadsto \color{blue}{\mathsf{fma}\left(\mathsf{min}\left(p, 0\right), \frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)}, p - -1\right)} \]
    6. Step-by-step derivation
      1. lift-fma.f64N/A

        \[\leadsto \color{blue}{\mathsf{min}\left(p, 0\right) \cdot \frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)} + \left(p - -1\right)} \]
      2. lift--.f64N/A

        \[\leadsto \mathsf{min}\left(p, 0\right) \cdot \frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)} + \color{blue}{\left(p - -1\right)} \]
      3. associate-+r-N/A

        \[\leadsto \color{blue}{\left(\mathsf{min}\left(p, 0\right) \cdot \frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)} + p\right) - -1} \]
      4. lower--.f64N/A

        \[\leadsto \color{blue}{\left(\mathsf{min}\left(p, 0\right) \cdot \frac{\mathsf{min}\left(p, 0\right)}{1 - \mathsf{min}\left(p, 0\right)} + p\right) - -1} \]
    7. Applied rewrites76.6%

      \[\leadsto \color{blue}{\left(p - \frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}}\right) - -1} \]
    8. Taylor expanded in p around 0

      \[\leadsto \color{blue}{1 - \frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}}} \]
    9. Step-by-step derivation
      1. lower--.f64N/A

        \[\leadsto 1 - \color{blue}{\frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}}} \]
      2. lower-/.f64N/A

        \[\leadsto 1 - \frac{\mathsf{min}\left(0, p\right)}{\color{blue}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}}} \]
      3. lower-fmin.f64N/A

        \[\leadsto 1 - \frac{\mathsf{min}\left(0, p\right)}{\color{blue}{1} - \frac{1}{\mathsf{min}\left(0, p\right)}} \]
      4. lower--.f64N/A

        \[\leadsto 1 - \frac{\mathsf{min}\left(0, p\right)}{1 - \color{blue}{\frac{1}{\mathsf{min}\left(0, p\right)}}} \]
      5. lower-/.f64N/A

        \[\leadsto 1 - \frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\color{blue}{\mathsf{min}\left(0, p\right)}}} \]
      6. lower-fmin.f6451.5%

        \[\leadsto 1 - \frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, \color{blue}{p}\right)}} \]
    10. Applied rewrites51.5%

      \[\leadsto \color{blue}{1 - \frac{\mathsf{min}\left(0, p\right)}{1 - \frac{1}{\mathsf{min}\left(0, p\right)}}} \]

    if 35 < p

    1. Initial program 76.0%

      \[\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1} \]
    2. Step-by-step derivation
      1. lift--.f64N/A

        \[\leadsto \color{blue}{\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
      2. lift-/.f64N/A

        \[\leadsto \left(p + 1\right) - \color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
      3. sub-to-fractionN/A

        \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) - {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
      4. lower-/.f64N/A

        \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) - {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    3. Applied rewrites76.1%

      \[\leadsto \color{blue}{\frac{\left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
    4. Taylor expanded in p around inf

      \[\leadsto \color{blue}{-1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
    5. Step-by-step derivation
      1. lower-*.f64N/A

        \[\leadsto -1 \cdot \color{blue}{\frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
      2. lower-/.f64N/A

        \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
      3. lower-*.f64N/A

        \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right)} - 1} \]
      4. lower--.f64N/A

        \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, \color{blue}{p}\right) - 1} \]
      5. lower-fmin.f64N/A

        \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
      6. lower--.f64N/A

        \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - \color{blue}{1}} \]
      7. lower-fmin.f6426.4%

        \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    6. Applied rewrites26.4%

      \[\leadsto \color{blue}{-1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
    7. Step-by-step derivation
      1. lift-*.f64N/A

        \[\leadsto -1 \cdot \color{blue}{\frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
      2. lift-/.f64N/A

        \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
      3. associate-*r/N/A

        \[\leadsto \frac{-1 \cdot \left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
      4. mul-1-negN/A

        \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right)} - 1} \]
      5. lift--.f64N/A

        \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - \color{blue}{1}} \]
      6. lift-fmin.f64N/A

        \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
      7. fmin-swapN/A

        \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(p, 0\right) - 1} \]
      8. lift-fmin.f64N/A

        \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(p, 0\right) - 1} \]
      9. lift--.f64N/A

        \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(p, 0\right) - \color{blue}{1}} \]
      10. lower-/.f64N/A

        \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\color{blue}{\mathsf{min}\left(p, 0\right) - 1}} \]
    8. Applied rewrites26.4%

      \[\leadsto \frac{\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
  3. Recombined 2 regimes into one program.
  4. Add Preprocessing

Alternative 5: 26.5% accurate, 1.9× speedup?

\[\begin{array}{l} t_0 := \mathsf{min}\left(0, p\right) - 1\\ \frac{p}{t\_0} \cdot t\_0 \end{array} \]
(FPCore (p)
  :precision binary64
  (let* ((t_0 (- (fmin 0.0 p) 1.0))) (* (/ p t_0) t_0)))
double code(double p) {
	double t_0 = fmin(0.0, p) - 1.0;
	return (p / t_0) * t_0;
}
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(8) function code(p)
use fmin_fmax_functions
    real(8), intent (in) :: p
    real(8) :: t_0
    t_0 = fmin(0.0d0, p) - 1.0d0
    code = (p / t_0) * t_0
end function
public static double code(double p) {
	double t_0 = fmin(0.0, p) - 1.0;
	return (p / t_0) * t_0;
}
def code(p):
	t_0 = fmin(0.0, p) - 1.0
	return (p / t_0) * t_0
function code(p)
	t_0 = Float64(fmin(0.0, p) - 1.0)
	return Float64(Float64(p / t_0) * t_0)
end
function tmp = code(p)
	t_0 = min(0.0, p) - 1.0;
	tmp = (p / t_0) * t_0;
end
code[p_] := Block[{t$95$0 = N[(N[Min[0.0, p], $MachinePrecision] - 1.0), $MachinePrecision]}, N[(N[(p / t$95$0), $MachinePrecision] * t$95$0), $MachinePrecision]]
\begin{array}{l}
t_0 := \mathsf{min}\left(0, p\right) - 1\\
\frac{p}{t\_0} \cdot t\_0
\end{array}
Derivation
  1. Initial program 76.0%

    \[\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1} \]
  2. Step-by-step derivation
    1. lift--.f64N/A

      \[\leadsto \color{blue}{\left(p + 1\right) - \frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    2. lift-/.f64N/A

      \[\leadsto \left(p + 1\right) - \color{blue}{\frac{{\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    3. sub-to-fractionN/A

      \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) - {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
    4. lower-/.f64N/A

      \[\leadsto \color{blue}{\frac{\left(p + 1\right) \cdot \left(\mathsf{min}\left(p, 0\right) - 1\right) - {\left(\mathsf{min}\left(p, 0\right)\right)}^{2}}{\mathsf{min}\left(p, 0\right) - 1}} \]
  3. Applied rewrites76.1%

    \[\leadsto \color{blue}{\frac{\left(-1 - p\right) \cdot \left(1 - \mathsf{min}\left(0, p\right)\right) - \mathsf{min}\left(0, p\right) \cdot \mathsf{min}\left(0, p\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
  4. Taylor expanded in p around inf

    \[\leadsto \color{blue}{-1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
  5. Step-by-step derivation
    1. lower-*.f64N/A

      \[\leadsto -1 \cdot \color{blue}{\frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
    2. lower-/.f64N/A

      \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
    3. lower-*.f64N/A

      \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right)} - 1} \]
    4. lower--.f64N/A

      \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, \color{blue}{p}\right) - 1} \]
    5. lower-fmin.f64N/A

      \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    6. lower--.f64N/A

      \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - \color{blue}{1}} \]
    7. lower-fmin.f6426.4%

      \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
  6. Applied rewrites26.4%

    \[\leadsto \color{blue}{-1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
  7. Step-by-step derivation
    1. lift-*.f64N/A

      \[\leadsto -1 \cdot \color{blue}{\frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\mathsf{min}\left(0, p\right) - 1}} \]
    2. lift-/.f64N/A

      \[\leadsto -1 \cdot \frac{p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
    3. associate-*r/N/A

      \[\leadsto \frac{-1 \cdot \left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
    4. mul-1-negN/A

      \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\color{blue}{\mathsf{min}\left(0, p\right)} - 1} \]
    5. lift--.f64N/A

      \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - \color{blue}{1}} \]
    6. lift-fmin.f64N/A

      \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(0, p\right) - 1} \]
    7. fmin-swapN/A

      \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(p, 0\right) - 1} \]
    8. lift-fmin.f64N/A

      \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(p, 0\right) - 1} \]
    9. lift--.f64N/A

      \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\mathsf{min}\left(p, 0\right) - \color{blue}{1}} \]
    10. lower-/.f64N/A

      \[\leadsto \frac{\mathsf{neg}\left(p \cdot \left(1 - \mathsf{min}\left(0, p\right)\right)\right)}{\color{blue}{\mathsf{min}\left(p, 0\right) - 1}} \]
  8. Applied rewrites26.4%

    \[\leadsto \frac{\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
  9. Step-by-step derivation
    1. lift-/.f64N/A

      \[\leadsto \frac{\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p}{\color{blue}{\mathsf{min}\left(0, p\right) - 1}} \]
    2. lift-*.f64N/A

      \[\leadsto \frac{\left(\mathsf{min}\left(0, p\right) - 1\right) \cdot p}{\color{blue}{\mathsf{min}\left(0, p\right)} - 1} \]
    3. associate-/l*N/A

      \[\leadsto \left(\mathsf{min}\left(0, p\right) - 1\right) \cdot \color{blue}{\frac{p}{\mathsf{min}\left(0, p\right) - 1}} \]
    4. *-commutativeN/A

      \[\leadsto \frac{p}{\mathsf{min}\left(0, p\right) - 1} \cdot \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right)} \]
    5. lower-*.f64N/A

      \[\leadsto \frac{p}{\mathsf{min}\left(0, p\right) - 1} \cdot \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right)} \]
    6. lower-/.f6426.5%

      \[\leadsto \frac{p}{\mathsf{min}\left(0, p\right) - 1} \cdot \left(\color{blue}{\mathsf{min}\left(0, p\right)} - 1\right) \]
  10. Applied rewrites26.5%

    \[\leadsto \frac{p}{\mathsf{min}\left(0, p\right) - 1} \cdot \color{blue}{\left(\mathsf{min}\left(0, p\right) - 1\right)} \]
  11. Add Preprocessing

Developer Target 1: 52.3% accurate, 1.5× speedup?

\[\begin{array}{l} \mathbf{if}\;p \geq -1 \cdot 10^{-6} \land p \leq 0:\\ \;\;\;\;\left(p + 1\right) - \frac{p \cdot p}{p - 1}\\ \mathbf{else}:\\ \;\;\;\;p - \mathsf{fma}\left(\frac{p}{p - 1}, p, -1\right)\\ \end{array} \]
(FPCore (p)
  :precision binary64
  (if (and (>= p -1e-6) (<= p 0.0))
  (- (+ p 1.0) (/ (* p p) (- p 1.0)))
  (- p (fma (/ p (- p 1.0)) p -1.0))))
double code(double p) {
	double tmp;
	if ((p >= -1e-6) && (p <= 0.0)) {
		tmp = (p + 1.0) - ((p * p) / (p - 1.0));
	} else {
		tmp = p - fma((p / (p - 1.0)), p, -1.0);
	}
	return tmp;
}
function code(p)
	tmp = 0.0
	if ((p >= -1e-6) && (p <= 0.0))
		tmp = Float64(Float64(p + 1.0) - Float64(Float64(p * p) / Float64(p - 1.0)));
	else
		tmp = Float64(p - fma(Float64(p / Float64(p - 1.0)), p, -1.0));
	end
	return tmp
end
code[p_] := If[And[GreaterEqual[p, -1e-6], LessEqual[p, 0.0]], N[(N[(p + 1.0), $MachinePrecision] - N[(N[(p * p), $MachinePrecision] / N[(p - 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(p - N[(N[(p / N[(p - 1.0), $MachinePrecision]), $MachinePrecision] * p + -1.0), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\mathbf{if}\;p \geq -1 \cdot 10^{-6} \land p \leq 0:\\
\;\;\;\;\left(p + 1\right) - \frac{p \cdot p}{p - 1}\\

\mathbf{else}:\\
\;\;\;\;p - \mathsf{fma}\left(\frac{p}{p - 1}, p, -1\right)\\


\end{array}

Reproduce

?
herbie shell --seed 2025212 
(FPCore (p)
  :name "peicewise-defined"
  :precision binary64
  :pre (and (>= p -1.79e+308) (<= p 1.79e+308))

  :alt
  (if (and (>= p -1/1000000) (<= p 0)) (- (+ p 1) (/ (* p p) (- p 1))) (- p (fma (/ p (- p 1)) p -1)))

  (- (+ p 1.0) (/ (pow (fmin p 0.0) 2.0) (- (fmin p 0.0) 1.0))))