
(FPCore (x a) :precision binary64 (- 1.0 (pow (- 1.0 x) a)))
double code(double x, double a) {
return 1.0 - pow((1.0 - x), a);
}
real(8) function code(x, a)
use fmin_fmax_functions
real(8), intent (in) :: x
real(8), intent (in) :: a
code = 1.0d0 - ((1.0d0 - x) ** a)
end function
public static double code(double x, double a) {
return 1.0 - Math.pow((1.0 - x), a);
}
def code(x, a): return 1.0 - math.pow((1.0 - x), a)
function code(x, a) return Float64(1.0 - (Float64(1.0 - x) ^ a)) end
function tmp = code(x, a) tmp = 1.0 - ((1.0 - x) ^ a); end
code[x_, a_] := N[(1.0 - N[Power[N[(1.0 - x), $MachinePrecision], a], $MachinePrecision]), $MachinePrecision]
1 - {\left(1 - x\right)}^{a}
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x a) :precision binary64 (- 1.0 (pow (- 1.0 x) a)))
double code(double x, double a) {
return 1.0 - pow((1.0 - x), a);
}
real(8) function code(x, a)
use fmin_fmax_functions
real(8), intent (in) :: x
real(8), intent (in) :: a
code = 1.0d0 - ((1.0d0 - x) ** a)
end function
public static double code(double x, double a) {
return 1.0 - Math.pow((1.0 - x), a);
}
def code(x, a): return 1.0 - math.pow((1.0 - x), a)
function code(x, a) return Float64(1.0 - (Float64(1.0 - x) ^ a)) end
function tmp = code(x, a) tmp = 1.0 - ((1.0 - x) ^ a); end
code[x_, a_] := N[(1.0 - N[Power[N[(1.0 - x), $MachinePrecision], a], $MachinePrecision]), $MachinePrecision]
1 - {\left(1 - x\right)}^{a}
(FPCore (x a)
:precision binary64
(*
(fma
(-
(*
(*
(-
(fma
(-
(fma
-0.4583333333333333
x
(*
(-
(* x (+ 0.25 (* -0.041666666666666664 a)))
-0.16666666666666666)
a))
0.5)
a
(* 0.25 x))
-0.3333333333333333)
a)
x)
(fma (* a a) 0.5 (* -0.5 a)))
x
a)
x))double code(double x, double a) {
return fma(((((fma((fma(-0.4583333333333333, x, (((x * (0.25 + (-0.041666666666666664 * a))) - -0.16666666666666666) * a)) - 0.5), a, (0.25 * x)) - -0.3333333333333333) * a) * x) - fma((a * a), 0.5, (-0.5 * a))), x, a) * x;
}
function code(x, a) return Float64(fma(Float64(Float64(Float64(Float64(fma(Float64(fma(-0.4583333333333333, x, Float64(Float64(Float64(x * Float64(0.25 + Float64(-0.041666666666666664 * a))) - -0.16666666666666666) * a)) - 0.5), a, Float64(0.25 * x)) - -0.3333333333333333) * a) * x) - fma(Float64(a * a), 0.5, Float64(-0.5 * a))), x, a) * x) end
code[x_, a_] := N[(N[(N[(N[(N[(N[(N[(N[(N[(-0.4583333333333333 * x + N[(N[(N[(x * N[(0.25 + N[(-0.041666666666666664 * a), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - -0.16666666666666666), $MachinePrecision] * a), $MachinePrecision]), $MachinePrecision] - 0.5), $MachinePrecision] * a + N[(0.25 * x), $MachinePrecision]), $MachinePrecision] - -0.3333333333333333), $MachinePrecision] * a), $MachinePrecision] * x), $MachinePrecision] - N[(N[(a * a), $MachinePrecision] * 0.5 + N[(-0.5 * a), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * x + a), $MachinePrecision] * x), $MachinePrecision]
\mathsf{fma}\left(\left(\left(\mathsf{fma}\left(\mathsf{fma}\left(-0.4583333333333333, x, \left(x \cdot \left(0.25 + -0.041666666666666664 \cdot a\right) - -0.16666666666666666\right) \cdot a\right) - 0.5, a, 0.25 \cdot x\right) - -0.3333333333333333\right) \cdot a\right) \cdot x - \mathsf{fma}\left(a \cdot a, 0.5, -0.5 \cdot a\right), x, a\right) \cdot x
Initial program 8.6%
Taylor expanded in x around 0
Applied rewrites99.6%
Taylor expanded in a around 0
lower-*.f64N/A
lower-+.f64N/A
lower-fma.f64N/A
lower-*.f64N/A
lower--.f64N/A
Applied rewrites99.6%
Applied rewrites99.6%
Taylor expanded in x around 0
lower-*.f64N/A
lower-+.f64N/A
lower-*.f6499.6%
Applied rewrites99.6%
(FPCore (x a)
:precision binary64
(*
(fma
(*
(-
(fma
0.3333333333333333
x
(* (- (* x (- (* 0.16666666666666666 a) 0.5)) 0.5) a))
-0.5)
a)
x
a)
x))double code(double x, double a) {
return fma(((fma(0.3333333333333333, x, (((x * ((0.16666666666666666 * a) - 0.5)) - 0.5) * a)) - -0.5) * a), x, a) * x;
}
function code(x, a) return Float64(fma(Float64(Float64(fma(0.3333333333333333, x, Float64(Float64(Float64(x * Float64(Float64(0.16666666666666666 * a) - 0.5)) - 0.5) * a)) - -0.5) * a), x, a) * x) end
code[x_, a_] := N[(N[(N[(N[(N[(0.3333333333333333 * x + N[(N[(N[(x * N[(N[(0.16666666666666666 * a), $MachinePrecision] - 0.5), $MachinePrecision]), $MachinePrecision] - 0.5), $MachinePrecision] * a), $MachinePrecision]), $MachinePrecision] - -0.5), $MachinePrecision] * a), $MachinePrecision] * x + a), $MachinePrecision] * x), $MachinePrecision]
\mathsf{fma}\left(\left(\mathsf{fma}\left(0.3333333333333333, x, \left(x \cdot \left(0.16666666666666666 \cdot a - 0.5\right) - 0.5\right) \cdot a\right) - -0.5\right) \cdot a, x, a\right) \cdot x
Initial program 8.6%
Taylor expanded in x around 0
lower-*.f64N/A
lower--.f64N/A
Applied rewrites99.4%
Taylor expanded in a around 0
lower-*.f64N/A
lower-+.f64N/A
lower-fma.f64N/A
lower-*.f64N/A
lower--.f64N/A
lower-fma.f64N/A
lower-*.f64N/A
lower-*.f6499.4%
Applied rewrites99.4%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6499.4%
Applied rewrites99.4%
Taylor expanded in x around 0
lower-*.f64N/A
lower--.f64N/A
lower-*.f6499.4%
Applied rewrites99.4%
(FPCore (x a) :precision binary64 (* (fma (* (+ 0.5 (* -0.5 a)) a) x a) x))
double code(double x, double a) {
return fma(((0.5 + (-0.5 * a)) * a), x, a) * x;
}
function code(x, a) return Float64(fma(Float64(Float64(0.5 + Float64(-0.5 * a)) * a), x, a) * x) end
code[x_, a_] := N[(N[(N[(N[(0.5 + N[(-0.5 * a), $MachinePrecision]), $MachinePrecision] * a), $MachinePrecision] * x + a), $MachinePrecision] * x), $MachinePrecision]
\mathsf{fma}\left(\left(0.5 + -0.5 \cdot a\right) \cdot a, x, a\right) \cdot x
Initial program 8.6%
Taylor expanded in x around 0
lower-*.f64N/A
lower--.f64N/A
Applied rewrites99.4%
Taylor expanded in a around 0
lower-*.f64N/A
lower-+.f64N/A
lower-fma.f64N/A
lower-*.f64N/A
lower--.f64N/A
lower-fma.f64N/A
lower-*.f64N/A
lower-*.f6499.4%
Applied rewrites99.4%
lift-*.f64N/A
*-commutativeN/A
lower-*.f6499.4%
Applied rewrites99.4%
Taylor expanded in x around 0
lower-+.f64N/A
lower-*.f6499.1%
Applied rewrites99.1%
(FPCore (x a) :precision binary64 (* a x))
double code(double x, double a) {
return a * x;
}
real(8) function code(x, a)
use fmin_fmax_functions
real(8), intent (in) :: x
real(8), intent (in) :: a
code = a * x
end function
public static double code(double x, double a) {
return a * x;
}
def code(x, a): return a * x
function code(x, a) return Float64(a * x) end
function tmp = code(x, a) tmp = a * x; end
code[x_, a_] := N[(a * x), $MachinePrecision]
a \cdot x
Initial program 8.6%
Taylor expanded in x around 0
lower-*.f6498.0%
Applied rewrites98.0%
herbie shell --seed 2025326
(FPCore (x a)
:name "Success Probability"
:precision binary64
:pre (and (and (<= 0.0 x) (<= x 1.0)) (and (<= 0.3333333333333333 a) (<= a 3.0)))
(- 1.0 (pow (- 1.0 x) a)))