
(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));
}
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}
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(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));
}
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}
(FPCore (p) :precision binary64 (- (fma (fmin 0.0 p) (/ (fmin 0.0 p) (- (fmin 0.0 p) 1.0)) (- -1.0 p))))
double code(double p) {
return -fma(fmin(0.0, p), (fmin(0.0, p) / (fmin(0.0, p) - 1.0)), (-1.0 - p));
}
function code(p) return Float64(-fma(fmin(0.0, p), Float64(fmin(0.0, p) / Float64(fmin(0.0, p) - 1.0)), Float64(-1.0 - p))) end
code[p_] := (-N[(N[Min[0.0, p], $MachinePrecision] * N[(N[Min[0.0, p], $MachinePrecision] / N[(N[Min[0.0, p], $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision] + N[(-1.0 - p), $MachinePrecision]), $MachinePrecision])
-\mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{\mathsf{min}\left(0, p\right) - 1}, -1 - p\right)
Initial program 76.6%
lift--.f64N/A
sub-negate-revN/A
lower-neg.f64N/A
sub-flipN/A
lift-/.f64N/A
lift-pow.f64N/A
unpow2N/A
associate-/l*N/A
lower-fma.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lower-/.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift-+.f64N/A
add-flipN/A
sub-negate-revN/A
lower--.f64N/A
metadata-eval77.3%
Applied rewrites77.3%
(FPCore (p) :precision binary64 (- (fma (/ (fmin 0.0 p) (- 1.0 (fmin 0.0 p))) (fmin 0.0 p) p) -1.0))
double code(double p) {
return fma((fmin(0.0, p) / (1.0 - fmin(0.0, p))), fmin(0.0, p), p) - -1.0;
}
function code(p) return Float64(fma(Float64(fmin(0.0, p) / Float64(1.0 - fmin(0.0, p))), fmin(0.0, p), p) - -1.0) end
code[p_] := N[(N[(N[(N[Min[0.0, p], $MachinePrecision] / N[(1.0 - N[Min[0.0, p], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Min[0.0, p], $MachinePrecision] + p), $MachinePrecision] - -1.0), $MachinePrecision]
\mathsf{fma}\left(\frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)}, \mathsf{min}\left(0, p\right), p\right) - -1
Initial program 76.6%
lift--.f64N/A
lift-/.f64N/A
frac-2negN/A
sub-to-fractionN/A
mult-flipN/A
lower-*.f64N/A
Applied rewrites76.6%
lift-*.f64N/A
lift-fma.f64N/A
*-commutativeN/A
lift-*.f64N/A
+-commutativeN/A
lift-*.f64N/A
lift-fma.f64N/A
lift-/.f64N/A
frac-2negN/A
metadata-evalN/A
lift--.f64N/A
sub-negate-revN/A
lift--.f64N/A
mult-flipN/A
Applied rewrites77.2%
(FPCore (p) :precision binary64 (- p (fma (fmin 0.0 p) (/ (fmin 0.0 p) (- (fmin 0.0 p) 1.0)) -1.0)))
double code(double p) {
return p - fma(fmin(0.0, p), (fmin(0.0, p) / (fmin(0.0, p) - 1.0)), -1.0);
}
function code(p) return Float64(p - fma(fmin(0.0, p), Float64(fmin(0.0, p) / Float64(fmin(0.0, p) - 1.0)), -1.0)) end
code[p_] := N[(p - N[(N[Min[0.0, p], $MachinePrecision] * N[(N[Min[0.0, p], $MachinePrecision] / N[(N[Min[0.0, p], $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]
p - \mathsf{fma}\left(\mathsf{min}\left(0, p\right), \frac{\mathsf{min}\left(0, p\right)}{\mathsf{min}\left(0, p\right) - 1}, -1\right)
Initial program 76.6%
lift--.f64N/A
lift-+.f64N/A
associate--l+N/A
sub-negate-revN/A
sub-flip-reverseN/A
lower--.f64N/A
sub-flipN/A
lift-/.f64N/A
lift-pow.f64N/A
unpow2N/A
associate-/l*N/A
lower-fma.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lower-/.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
metadata-eval77.2%
Applied rewrites77.2%
(FPCore (p)
:precision binary64
(let* ((t_0 (- (fmin 0.0 p) 1.0)))
(if (<= p 600000000000.0)
(-
(* (fmin 0.0 0.0) (/ (fmin 0.0 0.0) (- 1.0 (fmin 0.0 0.0))))
-1.0)
(/ (* t_0 p) t_0))))double code(double p) {
double t_0 = fmin(0.0, p) - 1.0;
double tmp;
if (p <= 600000000000.0) {
tmp = (fmin(0.0, 0.0) * (fmin(0.0, 0.0) / (1.0 - fmin(0.0, 0.0)))) - -1.0;
} else {
tmp = (t_0 * p) / t_0;
}
return tmp;
}
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 <= 600000000000.0d0) then
tmp = (fmin(0.0d0, 0.0d0) * (fmin(0.0d0, 0.0d0) / (1.0d0 - fmin(0.0d0, 0.0d0)))) - (-1.0d0)
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 <= 600000000000.0) {
tmp = (fmin(0.0, 0.0) * (fmin(0.0, 0.0) / (1.0 - fmin(0.0, 0.0)))) - -1.0;
} else {
tmp = (t_0 * p) / t_0;
}
return tmp;
}
def code(p): t_0 = fmin(0.0, p) - 1.0 tmp = 0 if p <= 600000000000.0: tmp = (fmin(0.0, 0.0) * (fmin(0.0, 0.0) / (1.0 - fmin(0.0, 0.0)))) - -1.0 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 <= 600000000000.0) tmp = Float64(Float64(fmin(0.0, 0.0) * Float64(fmin(0.0, 0.0) / Float64(1.0 - fmin(0.0, 0.0)))) - -1.0); 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 <= 600000000000.0) tmp = (min(0.0, 0.0) * (min(0.0, 0.0) / (1.0 - min(0.0, 0.0)))) - -1.0; 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, 600000000000.0], N[(N[(N[Min[0.0, 0.0], $MachinePrecision] * N[(N[Min[0.0, 0.0], $MachinePrecision] / N[(1.0 - N[Min[0.0, 0.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - -1.0), $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 600000000000:\\
\;\;\;\;\mathsf{min}\left(0, 0\right) \cdot \frac{\mathsf{min}\left(0, 0\right)}{1 - \mathsf{min}\left(0, 0\right)} - -1\\
\mathbf{else}:\\
\;\;\;\;\frac{t\_0 \cdot p}{t\_0}\\
\end{array}
if p < 6e11Initial program 76.6%
lift--.f64N/A
sub-flipN/A
+-commutativeN/A
add-flipN/A
lower--.f64N/A
lift-/.f64N/A
distribute-neg-frac2N/A
lower-/.f64N/A
lift-pow.f64N/A
unpow2N/A
lower-*.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift--.f64N/A
sub-negate-revN/A
lower--.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift-+.f64N/A
add-flipN/A
Applied rewrites76.6%
Taylor expanded in p around 0
Applied rewrites51.9%
Taylor expanded in undef-var around zero
Applied rewrites52.3%
Taylor expanded in undef-var around zero
Applied rewrites52.3%
Taylor expanded in undef-var around zero
Applied rewrites52.3%
lift-/.f64N/A
lift-*.f64N/A
associate-/l*N/A
lower-*.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lower-/.f6452.3%
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f6452.3%
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f6452.3%
Applied rewrites52.3%
if 6e11 < p Initial program 76.6%
lift--.f64N/A
lift-/.f64N/A
frac-2negN/A
sub-to-fractionN/A
mult-flipN/A
lower-*.f64N/A
Applied rewrites76.6%
Taylor expanded in p around inf
lower-*.f64N/A
lower-/.f64N/A
lower-*.f64N/A
lower--.f64N/A
lower-fmin.f64N/A
lower--.f64N/A
lower-fmin.f6426.5%
Applied rewrites26.5%
lift-*.f64N/A
lift-/.f64N/A
associate-*r/N/A
mul-1-negN/A
lower-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
distribute-lft-neg-inN/A
lift--.f64N/A
sub-negate-revN/A
lift--.f64N/A
lower-*.f6426.5%
Applied rewrites26.5%
(FPCore (p)
:precision binary64
(let* ((t_0 (- (fmin 0.0 p) 1.0)))
(if (<= p 600000000000.0)
(- (* (fmin 0.0 p) (/ (fmin 0.0 p) (- 1.0 (fmin 0.0 p)))) -1.0)
(/ (* t_0 p) t_0))))double code(double p) {
double t_0 = fmin(0.0, p) - 1.0;
double tmp;
if (p <= 600000000000.0) {
tmp = (fmin(0.0, p) * (fmin(0.0, p) / (1.0 - fmin(0.0, p)))) - -1.0;
} else {
tmp = (t_0 * p) / t_0;
}
return tmp;
}
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 <= 600000000000.0d0) then
tmp = (fmin(0.0d0, p) * (fmin(0.0d0, p) / (1.0d0 - fmin(0.0d0, p)))) - (-1.0d0)
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 <= 600000000000.0) {
tmp = (fmin(0.0, p) * (fmin(0.0, p) / (1.0 - fmin(0.0, p)))) - -1.0;
} else {
tmp = (t_0 * p) / t_0;
}
return tmp;
}
def code(p): t_0 = fmin(0.0, p) - 1.0 tmp = 0 if p <= 600000000000.0: tmp = (fmin(0.0, p) * (fmin(0.0, p) / (1.0 - fmin(0.0, p)))) - -1.0 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 <= 600000000000.0) tmp = Float64(Float64(fmin(0.0, p) * Float64(fmin(0.0, p) / Float64(1.0 - fmin(0.0, p)))) - -1.0); 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 <= 600000000000.0) tmp = (min(0.0, p) * (min(0.0, p) / (1.0 - min(0.0, p)))) - -1.0; 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, 600000000000.0], N[(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]), $MachinePrecision] - -1.0), $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 600000000000:\\
\;\;\;\;\mathsf{min}\left(0, p\right) \cdot \frac{\mathsf{min}\left(0, p\right)}{1 - \mathsf{min}\left(0, p\right)} - -1\\
\mathbf{else}:\\
\;\;\;\;\frac{t\_0 \cdot p}{t\_0}\\
\end{array}
if p < 6e11Initial program 76.6%
lift--.f64N/A
sub-flipN/A
+-commutativeN/A
add-flipN/A
lower--.f64N/A
lift-/.f64N/A
distribute-neg-frac2N/A
lower-/.f64N/A
lift-pow.f64N/A
unpow2N/A
lower-*.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift--.f64N/A
sub-negate-revN/A
lower--.f64N/A
lift-fmin.f64N/A
fmin-swapN/A
lower-fmin.f64N/A
lift-+.f64N/A
add-flipN/A
Applied rewrites76.6%
Taylor expanded in p around 0
Applied rewrites51.9%
lift-/.f64N/A
lift-*.f64N/A
associate-/l*N/A
lift-/.f64N/A
lower-*.f6451.9%
Applied rewrites51.9%
if 6e11 < p Initial program 76.6%
lift--.f64N/A
lift-/.f64N/A
frac-2negN/A
sub-to-fractionN/A
mult-flipN/A
lower-*.f64N/A
Applied rewrites76.6%
Taylor expanded in p around inf
lower-*.f64N/A
lower-/.f64N/A
lower-*.f64N/A
lower--.f64N/A
lower-fmin.f64N/A
lower--.f64N/A
lower-fmin.f6426.5%
Applied rewrites26.5%
lift-*.f64N/A
lift-/.f64N/A
associate-*r/N/A
mul-1-negN/A
lower-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
distribute-lft-neg-inN/A
lift--.f64N/A
sub-negate-revN/A
lift--.f64N/A
lower-*.f6426.5%
Applied rewrites26.5%
(FPCore (p) :precision binary64 (* (- p) (/ (- (fmin 0.0 p) 1.0) (- 1.0 (fmin 0.0 p)))))
double code(double p) {
return -p * ((fmin(0.0, p) - 1.0) / (1.0 - fmin(0.0, p)));
}
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)))
end function
public static double code(double p) {
return -p * ((fmin(0.0, p) - 1.0) / (1.0 - fmin(0.0, p)));
}
def code(p): return -p * ((fmin(0.0, p) - 1.0) / (1.0 - fmin(0.0, p)))
function code(p) return Float64(Float64(-p) * Float64(Float64(fmin(0.0, p) - 1.0) / Float64(1.0 - fmin(0.0, p)))) end
function tmp = code(p) tmp = -p * ((min(0.0, p) - 1.0) / (1.0 - min(0.0, p))); end
code[p_] := N[((-p) * N[(N[(N[Min[0.0, p], $MachinePrecision] - 1.0), $MachinePrecision] / N[(1.0 - N[Min[0.0, p], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\left(-p\right) \cdot \frac{\mathsf{min}\left(0, p\right) - 1}{1 - \mathsf{min}\left(0, p\right)}
Initial program 76.6%
lift--.f64N/A
lift-/.f64N/A
frac-2negN/A
sub-to-fractionN/A
mult-flipN/A
lower-*.f64N/A
Applied rewrites76.6%
Taylor expanded in p around inf
lower-*.f64N/A
lower-/.f64N/A
lower-*.f64N/A
lower--.f64N/A
lower-fmin.f64N/A
lower--.f64N/A
lower-fmin.f6426.5%
Applied rewrites26.5%
lift-*.f64N/A
mul-1-negN/A
lift-/.f64N/A
lift-*.f64N/A
associate-/l*N/A
distribute-lft-neg-inN/A
lower-*.f64N/A
lower-neg.f64N/A
lift--.f64N/A
sub-negate-revN/A
lift--.f64N/A
lift--.f64N/A
sub-negate-revN/A
lift--.f64N/A
frac-2neg-revN/A
lower-/.f6426.5%
Applied rewrites26.5%
(FPCore (p) :precision binary64 (let* ((t_0 (- (fmin 0.0 p) 1.0))) (/ (* t_0 p) t_0)))
double code(double p) {
double t_0 = fmin(0.0, p) - 1.0;
return (t_0 * p) / t_0;
}
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 = (t_0 * p) / t_0
end function
public static double code(double p) {
double t_0 = fmin(0.0, p) - 1.0;
return (t_0 * p) / t_0;
}
def code(p): t_0 = fmin(0.0, p) - 1.0 return (t_0 * p) / t_0
function code(p) t_0 = Float64(fmin(0.0, p) - 1.0) return Float64(Float64(t_0 * p) / t_0) end
function tmp = code(p) t_0 = min(0.0, p) - 1.0; tmp = (t_0 * p) / t_0; end
code[p_] := Block[{t$95$0 = N[(N[Min[0.0, p], $MachinePrecision] - 1.0), $MachinePrecision]}, N[(N[(t$95$0 * p), $MachinePrecision] / t$95$0), $MachinePrecision]]
\begin{array}{l}
t_0 := \mathsf{min}\left(0, p\right) - 1\\
\frac{t\_0 \cdot p}{t\_0}
\end{array}
Initial program 76.6%
lift--.f64N/A
lift-/.f64N/A
frac-2negN/A
sub-to-fractionN/A
mult-flipN/A
lower-*.f64N/A
Applied rewrites76.6%
Taylor expanded in p around inf
lower-*.f64N/A
lower-/.f64N/A
lower-*.f64N/A
lower--.f64N/A
lower-fmin.f64N/A
lower--.f64N/A
lower-fmin.f6426.5%
Applied rewrites26.5%
lift-*.f64N/A
lift-/.f64N/A
associate-*r/N/A
mul-1-negN/A
lower-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
distribute-lft-neg-inN/A
lift--.f64N/A
sub-negate-revN/A
lift--.f64N/A
lower-*.f6426.5%
Applied rewrites26.5%
(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}
herbie shell --seed 2025326
(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))))