
(FPCore (x) :precision binary64 (- 1.0 (sqrt (* 0.5 (+ 1.0 (/ 1.0 (hypot 1.0 x)))))))
double code(double x) {
return 1.0 - sqrt((0.5 * (1.0 + (1.0 / hypot(1.0, x)))));
}
public static double code(double x) {
return 1.0 - Math.sqrt((0.5 * (1.0 + (1.0 / Math.hypot(1.0, x)))));
}
def code(x): return 1.0 - math.sqrt((0.5 * (1.0 + (1.0 / math.hypot(1.0, x)))))
function code(x) return Float64(1.0 - sqrt(Float64(0.5 * Float64(1.0 + Float64(1.0 / hypot(1.0, x)))))) end
function tmp = code(x) tmp = 1.0 - sqrt((0.5 * (1.0 + (1.0 / hypot(1.0, x))))); end
code[x_] := N[(1.0 - N[Sqrt[N[(0.5 * N[(1.0 + N[(1.0 / N[Sqrt[1.0 ^ 2 + x ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
1 - \sqrt{0.5 \cdot \left(1 + \frac{1}{\mathsf{hypot}\left(1, x\right)}\right)}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 15 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x) :precision binary64 (- 1.0 (sqrt (* 0.5 (+ 1.0 (/ 1.0 (hypot 1.0 x)))))))
double code(double x) {
return 1.0 - sqrt((0.5 * (1.0 + (1.0 / hypot(1.0, x)))));
}
public static double code(double x) {
return 1.0 - Math.sqrt((0.5 * (1.0 + (1.0 / Math.hypot(1.0, x)))));
}
def code(x): return 1.0 - math.sqrt((0.5 * (1.0 + (1.0 / math.hypot(1.0, x)))))
function code(x) return Float64(1.0 - sqrt(Float64(0.5 * Float64(1.0 + Float64(1.0 / hypot(1.0, x)))))) end
function tmp = code(x) tmp = 1.0 - sqrt((0.5 * (1.0 + (1.0 / hypot(1.0, x))))); end
code[x_] := N[(1.0 - N[Sqrt[N[(0.5 * N[(1.0 + N[(1.0 / N[Sqrt[1.0 ^ 2 + x ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
1 - \sqrt{0.5 \cdot \left(1 + \frac{1}{\mathsf{hypot}\left(1, x\right)}\right)}
\end{array}
(FPCore (x)
:precision binary64
(let* ((t_0 (+ 0.5 (/ 0.5 (sqrt (fma x x 1.0))))))
(if (<= (hypot 1.0 x) 1.005)
(*
(* x x)
(fma
(* x x)
(fma (* x x) (fma (* x x) -0.056243896484375 0.0673828125) -0.0859375)
0.125))
(/ (/ (- 0.25 (/ 0.25 (fma x x 1.0))) (+ 1.0 (sqrt t_0))) t_0))))
double code(double x) {
double t_0 = 0.5 + (0.5 / sqrt(fma(x, x, 1.0)));
double tmp;
if (hypot(1.0, x) <= 1.005) {
tmp = (x * x) * fma((x * x), fma((x * x), fma((x * x), -0.056243896484375, 0.0673828125), -0.0859375), 0.125);
} else {
tmp = ((0.25 - (0.25 / fma(x, x, 1.0))) / (1.0 + sqrt(t_0))) / t_0;
}
return tmp;
}
function code(x) t_0 = Float64(0.5 + Float64(0.5 / sqrt(fma(x, x, 1.0)))) tmp = 0.0 if (hypot(1.0, x) <= 1.005) tmp = Float64(Float64(x * x) * fma(Float64(x * x), fma(Float64(x * x), fma(Float64(x * x), -0.056243896484375, 0.0673828125), -0.0859375), 0.125)); else tmp = Float64(Float64(Float64(0.25 - Float64(0.25 / fma(x, x, 1.0))) / Float64(1.0 + sqrt(t_0))) / t_0); end return tmp end
code[x_] := Block[{t$95$0 = N[(0.5 + N[(0.5 / N[Sqrt[N[(x * x + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[N[Sqrt[1.0 ^ 2 + x ^ 2], $MachinePrecision], 1.005], N[(N[(x * x), $MachinePrecision] * N[(N[(x * x), $MachinePrecision] * N[(N[(x * x), $MachinePrecision] * N[(N[(x * x), $MachinePrecision] * -0.056243896484375 + 0.0673828125), $MachinePrecision] + -0.0859375), $MachinePrecision] + 0.125), $MachinePrecision]), $MachinePrecision], N[(N[(N[(0.25 - N[(0.25 / N[(x * x + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(1.0 + N[Sqrt[t$95$0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / t$95$0), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 0.5 + \frac{0.5}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}\\
\mathbf{if}\;\mathsf{hypot}\left(1, x\right) \leq 1.005:\\
\;\;\;\;\left(x \cdot x\right) \cdot \mathsf{fma}\left(x \cdot x, \mathsf{fma}\left(x \cdot x, \mathsf{fma}\left(x \cdot x, -0.056243896484375, 0.0673828125\right), -0.0859375\right), 0.125\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{0.25 - \frac{0.25}{\mathsf{fma}\left(x, x, 1\right)}}{1 + \sqrt{t\_0}}}{t\_0}\\
\end{array}
\end{array}
if (hypot.f64 #s(literal 1 binary64) x) < 1.0049999999999999Initial program 54.3%
Applied rewrites54.4%
Taylor expanded in x around 0
lower-*.f64N/A
unpow2N/A
lower-*.f64N/A
+-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
sub-negN/A
metadata-evalN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64100.0
Applied rewrites100.0%
if 1.0049999999999999 < (hypot.f64 #s(literal 1 binary64) x) Initial program 98.4%
Applied rewrites99.8%
Applied rewrites99.9%
lift-*.f64N/A
lift-/.f64N/A
associate-*r/N/A
Applied rewrites99.9%
(FPCore (x)
:precision binary64
(let* ((t_0 (+ 0.5 (/ 0.5 (sqrt (fma x x 1.0))))))
(if (<= (hypot 1.0 x) 1.005)
(*
(* x x)
(fma
(* x x)
(fma (* x x) (fma (* x x) -0.056243896484375 0.0673828125) -0.0859375)
0.125))
(* (- 0.25 (/ 0.25 (fma x x 1.0))) (/ 1.0 (* t_0 (+ 1.0 (sqrt t_0))))))))
double code(double x) {
double t_0 = 0.5 + (0.5 / sqrt(fma(x, x, 1.0)));
double tmp;
if (hypot(1.0, x) <= 1.005) {
tmp = (x * x) * fma((x * x), fma((x * x), fma((x * x), -0.056243896484375, 0.0673828125), -0.0859375), 0.125);
} else {
tmp = (0.25 - (0.25 / fma(x, x, 1.0))) * (1.0 / (t_0 * (1.0 + sqrt(t_0))));
}
return tmp;
}
function code(x) t_0 = Float64(0.5 + Float64(0.5 / sqrt(fma(x, x, 1.0)))) tmp = 0.0 if (hypot(1.0, x) <= 1.005) tmp = Float64(Float64(x * x) * fma(Float64(x * x), fma(Float64(x * x), fma(Float64(x * x), -0.056243896484375, 0.0673828125), -0.0859375), 0.125)); else tmp = Float64(Float64(0.25 - Float64(0.25 / fma(x, x, 1.0))) * Float64(1.0 / Float64(t_0 * Float64(1.0 + sqrt(t_0))))); end return tmp end
code[x_] := Block[{t$95$0 = N[(0.5 + N[(0.5 / N[Sqrt[N[(x * x + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[N[Sqrt[1.0 ^ 2 + x ^ 2], $MachinePrecision], 1.005], N[(N[(x * x), $MachinePrecision] * N[(N[(x * x), $MachinePrecision] * N[(N[(x * x), $MachinePrecision] * N[(N[(x * x), $MachinePrecision] * -0.056243896484375 + 0.0673828125), $MachinePrecision] + -0.0859375), $MachinePrecision] + 0.125), $MachinePrecision]), $MachinePrecision], N[(N[(0.25 - N[(0.25 / N[(x * x + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(1.0 / N[(t$95$0 * N[(1.0 + N[Sqrt[t$95$0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 0.5 + \frac{0.5}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}\\
\mathbf{if}\;\mathsf{hypot}\left(1, x\right) \leq 1.005:\\
\;\;\;\;\left(x \cdot x\right) \cdot \mathsf{fma}\left(x \cdot x, \mathsf{fma}\left(x \cdot x, \mathsf{fma}\left(x \cdot x, -0.056243896484375, 0.0673828125\right), -0.0859375\right), 0.125\right)\\
\mathbf{else}:\\
\;\;\;\;\left(0.25 - \frac{0.25}{\mathsf{fma}\left(x, x, 1\right)}\right) \cdot \frac{1}{t\_0 \cdot \left(1 + \sqrt{t\_0}\right)}\\
\end{array}
\end{array}
if (hypot.f64 #s(literal 1 binary64) x) < 1.0049999999999999Initial program 53.4%
Applied rewrites53.5%
Taylor expanded in x around 0
lower-*.f64N/A
unpow2N/A
lower-*.f64N/A
+-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
sub-negN/A
metadata-evalN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f64N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
unpow2N/A
lower-*.f6499.9
Applied rewrites99.9%
if 1.0049999999999999 < (hypot.f64 #s(literal 1 binary64) x) Initial program 98.5%
Applied rewrites100.0%
Applied rewrites99.9%
Applied rewrites99.9%
herbie shell --seed 2024228
(FPCore (x)
:name "Given's Rotation SVD example, simplified"
:precision binary64
(- 1.0 (sqrt (* 0.5 (+ 1.0 (/ 1.0 (hypot 1.0 x)))))))