
(FPCore (v t) :precision binary64 (/ (- 1.0 (* 5.0 (* v v))) (* (* (* PI t) (sqrt (* 2.0 (- 1.0 (* 3.0 (* v v)))))) (- 1.0 (* v v)))))
double code(double v, double t) {
return (1.0 - (5.0 * (v * v))) / (((((double) M_PI) * t) * sqrt((2.0 * (1.0 - (3.0 * (v * v)))))) * (1.0 - (v * v)));
}
public static double code(double v, double t) {
return (1.0 - (5.0 * (v * v))) / (((Math.PI * t) * Math.sqrt((2.0 * (1.0 - (3.0 * (v * v)))))) * (1.0 - (v * v)));
}
def code(v, t): return (1.0 - (5.0 * (v * v))) / (((math.pi * t) * math.sqrt((2.0 * (1.0 - (3.0 * (v * v)))))) * (1.0 - (v * v)))
function code(v, t) return Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(Float64(Float64(pi * t) * sqrt(Float64(2.0 * Float64(1.0 - Float64(3.0 * Float64(v * v)))))) * Float64(1.0 - Float64(v * v)))) end
function tmp = code(v, t) tmp = (1.0 - (5.0 * (v * v))) / (((pi * t) * sqrt((2.0 * (1.0 - (3.0 * (v * v)))))) * (1.0 - (v * v))); end
code[v_, t_] := N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(N[(Pi * t), $MachinePrecision] * N[Sqrt[N[(2.0 * N[(1.0 - N[(3.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] * N[(1.0 - N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1 - 5 \cdot \left(v \cdot v\right)}{\left(\left(\pi \cdot t\right) \cdot \sqrt{2 \cdot \left(1 - 3 \cdot \left(v \cdot v\right)\right)}\right) \cdot \left(1 - v \cdot v\right)}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (v t) :precision binary64 (/ (- 1.0 (* 5.0 (* v v))) (* (* (* PI t) (sqrt (* 2.0 (- 1.0 (* 3.0 (* v v)))))) (- 1.0 (* v v)))))
double code(double v, double t) {
return (1.0 - (5.0 * (v * v))) / (((((double) M_PI) * t) * sqrt((2.0 * (1.0 - (3.0 * (v * v)))))) * (1.0 - (v * v)));
}
public static double code(double v, double t) {
return (1.0 - (5.0 * (v * v))) / (((Math.PI * t) * Math.sqrt((2.0 * (1.0 - (3.0 * (v * v)))))) * (1.0 - (v * v)));
}
def code(v, t): return (1.0 - (5.0 * (v * v))) / (((math.pi * t) * math.sqrt((2.0 * (1.0 - (3.0 * (v * v)))))) * (1.0 - (v * v)))
function code(v, t) return Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(Float64(Float64(pi * t) * sqrt(Float64(2.0 * Float64(1.0 - Float64(3.0 * Float64(v * v)))))) * Float64(1.0 - Float64(v * v)))) end
function tmp = code(v, t) tmp = (1.0 - (5.0 * (v * v))) / (((pi * t) * sqrt((2.0 * (1.0 - (3.0 * (v * v)))))) * (1.0 - (v * v))); end
code[v_, t_] := N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(N[(Pi * t), $MachinePrecision] * N[Sqrt[N[(2.0 * N[(1.0 - N[(3.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] * N[(1.0 - N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1 - 5 \cdot \left(v \cdot v\right)}{\left(\left(\pi \cdot t\right) \cdot \sqrt{2 \cdot \left(1 - 3 \cdot \left(v \cdot v\right)\right)}\right) \cdot \left(1 - v \cdot v\right)}
\end{array}
(FPCore (v t) :precision binary64 (/ (- 1.0 (* 5.0 (* v v))) (* (* (pow (fma -3.0 (* v v) 1.0) 0.5) (* (* (pow 2.0 0.5) PI) t)) (- 1.0 (* v v)))))
double code(double v, double t) {
return (1.0 - (5.0 * (v * v))) / ((pow(fma(-3.0, (v * v), 1.0), 0.5) * ((pow(2.0, 0.5) * ((double) M_PI)) * t)) * (1.0 - (v * v)));
}
function code(v, t) return Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(Float64((fma(-3.0, Float64(v * v), 1.0) ^ 0.5) * Float64(Float64((2.0 ^ 0.5) * pi) * t)) * Float64(1.0 - Float64(v * v)))) end
code[v_, t_] := N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(N[Power[N[(-3.0 * N[(v * v), $MachinePrecision] + 1.0), $MachinePrecision], 0.5], $MachinePrecision] * N[(N[(N[Power[2.0, 0.5], $MachinePrecision] * Pi), $MachinePrecision] * t), $MachinePrecision]), $MachinePrecision] * N[(1.0 - N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1 - 5 \cdot \left(v \cdot v\right)}{\left({\left(\mathsf{fma}\left(-3, v \cdot v, 1\right)\right)}^{0.5} \cdot \left(\left({2}^{0.5} \cdot \pi\right) \cdot t\right)\right) \cdot \left(1 - v \cdot v\right)}
\end{array}
Initial program 99.3%
Taylor expanded in t around 0
*-commutativeN/A
lower-*.f64N/A
pow1/2N/A
pow2N/A
lower-pow.f64N/A
pow2N/A
fp-cancel-sub-sign-invN/A
metadata-evalN/A
+-commutativeN/A
lower-fma.f64N/A
pow2N/A
lift-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
Applied rewrites99.5%
(FPCore (v t)
:precision binary64
(*
(/
(/ (fma (pow v 6.0) -125.0 1.0) t)
(*
(* (pow 2.0 0.5) PI)
(*
(+ (fma (* v 5.0) v (* (pow v 4.0) 25.0)) 1.0)
(/ (- 1.0 (pow v 4.0)) (+ 1.0 (* v v))))))
(pow (pow (fma (* v v) -3.0 1.0) -1.0) 0.5)))
double code(double v, double t) {
return ((fma(pow(v, 6.0), -125.0, 1.0) / t) / ((pow(2.0, 0.5) * ((double) M_PI)) * ((fma((v * 5.0), v, (pow(v, 4.0) * 25.0)) + 1.0) * ((1.0 - pow(v, 4.0)) / (1.0 + (v * v)))))) * pow(pow(fma((v * v), -3.0, 1.0), -1.0), 0.5);
}
function code(v, t) return Float64(Float64(Float64(fma((v ^ 6.0), -125.0, 1.0) / t) / Float64(Float64((2.0 ^ 0.5) * pi) * Float64(Float64(fma(Float64(v * 5.0), v, Float64((v ^ 4.0) * 25.0)) + 1.0) * Float64(Float64(1.0 - (v ^ 4.0)) / Float64(1.0 + Float64(v * v)))))) * ((fma(Float64(v * v), -3.0, 1.0) ^ -1.0) ^ 0.5)) end
code[v_, t_] := N[(N[(N[(N[(N[Power[v, 6.0], $MachinePrecision] * -125.0 + 1.0), $MachinePrecision] / t), $MachinePrecision] / N[(N[(N[Power[2.0, 0.5], $MachinePrecision] * Pi), $MachinePrecision] * N[(N[(N[(N[(v * 5.0), $MachinePrecision] * v + N[(N[Power[v, 4.0], $MachinePrecision] * 25.0), $MachinePrecision]), $MachinePrecision] + 1.0), $MachinePrecision] * N[(N[(1.0 - N[Power[v, 4.0], $MachinePrecision]), $MachinePrecision] / N[(1.0 + N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Power[N[Power[N[(N[(v * v), $MachinePrecision] * -3.0 + 1.0), $MachinePrecision], -1.0], $MachinePrecision], 0.5], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\frac{\mathsf{fma}\left({v}^{6}, -125, 1\right)}{t}}{\left({2}^{0.5} \cdot \pi\right) \cdot \left(\left(\mathsf{fma}\left(v \cdot 5, v, {v}^{4} \cdot 25\right) + 1\right) \cdot \frac{1 - {v}^{4}}{1 + v \cdot v}\right)} \cdot {\left({\left(\mathsf{fma}\left(v \cdot v, -3, 1\right)\right)}^{-1}\right)}^{0.5}
\end{array}
Initial program 99.3%
lift--.f64N/A
flip3--N/A
lower-/.f64N/A
metadata-evalN/A
lower--.f64N/A
lower-pow.f64N/A
lift-*.f64N/A
lift-*.f64N/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f64N/A
metadata-evalN/A
lower-+.f64N/A
lower-fma.f64N/A
Applied rewrites99.3%
Taylor expanded in t around 0
Applied rewrites99.4%
(FPCore (v t)
:precision binary64
(let* ((t_1 (* (pow (pow 4.0 0.125) 2.0) PI)) (t_2 (pow (* t_1 t) -1.0)))
(*
(fma
(pow t_1 -1.0)
(pow t -1.0)
(*
(fma (fma t_2 -4.0 (/ (* -4.0 (/ (* v v) t)) t_1)) (* v v) (* t_2 -4.0))
(* v v)))
(pow (pow (fma (* v v) -3.0 1.0) -1.0) 0.5))))
double code(double v, double t) {
double t_1 = pow(pow(4.0, 0.125), 2.0) * ((double) M_PI);
double t_2 = pow((t_1 * t), -1.0);
return fma(pow(t_1, -1.0), pow(t, -1.0), (fma(fma(t_2, -4.0, ((-4.0 * ((v * v) / t)) / t_1)), (v * v), (t_2 * -4.0)) * (v * v))) * pow(pow(fma((v * v), -3.0, 1.0), -1.0), 0.5);
}
function code(v, t) t_1 = Float64(((4.0 ^ 0.125) ^ 2.0) * pi) t_2 = Float64(t_1 * t) ^ -1.0 return Float64(fma((t_1 ^ -1.0), (t ^ -1.0), Float64(fma(fma(t_2, -4.0, Float64(Float64(-4.0 * Float64(Float64(v * v) / t)) / t_1)), Float64(v * v), Float64(t_2 * -4.0)) * Float64(v * v))) * ((fma(Float64(v * v), -3.0, 1.0) ^ -1.0) ^ 0.5)) end
code[v_, t_] := Block[{t$95$1 = N[(N[Power[N[Power[4.0, 0.125], $MachinePrecision], 2.0], $MachinePrecision] * Pi), $MachinePrecision]}, Block[{t$95$2 = N[Power[N[(t$95$1 * t), $MachinePrecision], -1.0], $MachinePrecision]}, N[(N[(N[Power[t$95$1, -1.0], $MachinePrecision] * N[Power[t, -1.0], $MachinePrecision] + N[(N[(N[(t$95$2 * -4.0 + N[(N[(-4.0 * N[(N[(v * v), $MachinePrecision] / t), $MachinePrecision]), $MachinePrecision] / t$95$1), $MachinePrecision]), $MachinePrecision] * N[(v * v), $MachinePrecision] + N[(t$95$2 * -4.0), $MachinePrecision]), $MachinePrecision] * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Power[N[Power[N[(N[(v * v), $MachinePrecision] * -3.0 + 1.0), $MachinePrecision], -1.0], $MachinePrecision], 0.5], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_1 := {\left({4}^{0.125}\right)}^{2} \cdot \pi\\
t_2 := {\left(t\_1 \cdot t\right)}^{-1}\\
\mathsf{fma}\left({t\_1}^{-1}, {t}^{-1}, \mathsf{fma}\left(\mathsf{fma}\left(t\_2, -4, \frac{-4 \cdot \frac{v \cdot v}{t}}{t\_1}\right), v \cdot v, t\_2 \cdot -4\right) \cdot \left(v \cdot v\right)\right) \cdot {\left({\left(\mathsf{fma}\left(v \cdot v, -3, 1\right)\right)}^{-1}\right)}^{0.5}
\end{array}
\end{array}
Initial program 99.3%
lift--.f64N/A
flip3--N/A
lower-/.f64N/A
metadata-evalN/A
lower--.f64N/A
lower-pow.f64N/A
lift-*.f64N/A
lift-*.f64N/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f64N/A
metadata-evalN/A
lower-+.f64N/A
lower-fma.f64N/A
Applied rewrites99.3%
Taylor expanded in t around 0
Applied rewrites99.4%
Taylor expanded in v around 0
Applied rewrites98.6%
Applied rewrites99.1%
(FPCore (v t)
:precision binary64
(let* ((t_1 (* (pow (pow 4.0 0.125) 2.0) PI))
(t_2 (* -4.0 (pow (* t_1 t) -1.0))))
(*
(fma
(pow (* t PI) -1.0)
(pow (pow 4.0 0.25) -1.0)
(* (fma (fma -4.0 (/ (/ (* v v) t) t_1) t_2) (* v v) t_2) (* v v)))
(pow (pow (fma (* v v) -3.0 1.0) -1.0) 0.5))))
double code(double v, double t) {
double t_1 = pow(pow(4.0, 0.125), 2.0) * ((double) M_PI);
double t_2 = -4.0 * pow((t_1 * t), -1.0);
return fma(pow((t * ((double) M_PI)), -1.0), pow(pow(4.0, 0.25), -1.0), (fma(fma(-4.0, (((v * v) / t) / t_1), t_2), (v * v), t_2) * (v * v))) * pow(pow(fma((v * v), -3.0, 1.0), -1.0), 0.5);
}
function code(v, t) t_1 = Float64(((4.0 ^ 0.125) ^ 2.0) * pi) t_2 = Float64(-4.0 * (Float64(t_1 * t) ^ -1.0)) return Float64(fma((Float64(t * pi) ^ -1.0), ((4.0 ^ 0.25) ^ -1.0), Float64(fma(fma(-4.0, Float64(Float64(Float64(v * v) / t) / t_1), t_2), Float64(v * v), t_2) * Float64(v * v))) * ((fma(Float64(v * v), -3.0, 1.0) ^ -1.0) ^ 0.5)) end
code[v_, t_] := Block[{t$95$1 = N[(N[Power[N[Power[4.0, 0.125], $MachinePrecision], 2.0], $MachinePrecision] * Pi), $MachinePrecision]}, Block[{t$95$2 = N[(-4.0 * N[Power[N[(t$95$1 * t), $MachinePrecision], -1.0], $MachinePrecision]), $MachinePrecision]}, N[(N[(N[Power[N[(t * Pi), $MachinePrecision], -1.0], $MachinePrecision] * N[Power[N[Power[4.0, 0.25], $MachinePrecision], -1.0], $MachinePrecision] + N[(N[(N[(-4.0 * N[(N[(N[(v * v), $MachinePrecision] / t), $MachinePrecision] / t$95$1), $MachinePrecision] + t$95$2), $MachinePrecision] * N[(v * v), $MachinePrecision] + t$95$2), $MachinePrecision] * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Power[N[Power[N[(N[(v * v), $MachinePrecision] * -3.0 + 1.0), $MachinePrecision], -1.0], $MachinePrecision], 0.5], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_1 := {\left({4}^{0.125}\right)}^{2} \cdot \pi\\
t_2 := -4 \cdot {\left(t\_1 \cdot t\right)}^{-1}\\
\mathsf{fma}\left({\left(t \cdot \pi\right)}^{-1}, {\left({4}^{0.25}\right)}^{-1}, \mathsf{fma}\left(\mathsf{fma}\left(-4, \frac{\frac{v \cdot v}{t}}{t\_1}, t\_2\right), v \cdot v, t\_2\right) \cdot \left(v \cdot v\right)\right) \cdot {\left({\left(\mathsf{fma}\left(v \cdot v, -3, 1\right)\right)}^{-1}\right)}^{0.5}
\end{array}
\end{array}
Initial program 99.3%
lift--.f64N/A
flip3--N/A
lower-/.f64N/A
metadata-evalN/A
lower--.f64N/A
lower-pow.f64N/A
lift-*.f64N/A
lift-*.f64N/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f64N/A
metadata-evalN/A
lower-+.f64N/A
lower-fma.f64N/A
Applied rewrites99.3%
Taylor expanded in t around 0
Applied rewrites99.4%
Taylor expanded in v around 0
Applied rewrites98.6%
lift-pow.f64N/A
lift-pow.f64N/A
pow-powN/A
metadata-evalN/A
lower-pow.f6498.8
Applied rewrites98.8%
herbie shell --seed 2025065
(FPCore (v t)
:name "Falkner and Boettcher, Equation (20:1,3)"
:precision binary64
(/ (- 1.0 (* 5.0 (* v v))) (* (* (* PI t) (sqrt (* 2.0 (- 1.0 (* 3.0 (* v v)))))) (- 1.0 (* v v)))))