
(FPCore (t) :precision binary64 (let* ((t_1 (- 2.0 (/ (/ 2.0 t) (+ 1.0 (/ 1.0 t)))))) (- 1.0 (/ 1.0 (+ 2.0 (* t_1 t_1))))))
double code(double t) {
double t_1 = 2.0 - ((2.0 / t) / (1.0 + (1.0 / t)));
return 1.0 - (1.0 / (2.0 + (t_1 * t_1)));
}
real(8) function code(t)
real(8), intent (in) :: t
real(8) :: t_1
t_1 = 2.0d0 - ((2.0d0 / t) / (1.0d0 + (1.0d0 / t)))
code = 1.0d0 - (1.0d0 / (2.0d0 + (t_1 * t_1)))
end function
public static double code(double t) {
double t_1 = 2.0 - ((2.0 / t) / (1.0 + (1.0 / t)));
return 1.0 - (1.0 / (2.0 + (t_1 * t_1)));
}
def code(t): t_1 = 2.0 - ((2.0 / t) / (1.0 + (1.0 / t))) return 1.0 - (1.0 / (2.0 + (t_1 * t_1)))
function code(t) t_1 = Float64(2.0 - Float64(Float64(2.0 / t) / Float64(1.0 + Float64(1.0 / t)))) return Float64(1.0 - Float64(1.0 / Float64(2.0 + Float64(t_1 * t_1)))) end
function tmp = code(t) t_1 = 2.0 - ((2.0 / t) / (1.0 + (1.0 / t))); tmp = 1.0 - (1.0 / (2.0 + (t_1 * t_1))); end
code[t_] := Block[{t$95$1 = N[(2.0 - N[(N[(2.0 / t), $MachinePrecision] / N[(1.0 + N[(1.0 / t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, N[(1.0 - N[(1.0 / N[(2.0 + N[(t$95$1 * t$95$1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_1 := 2 - \frac{\frac{2}{t}}{1 + \frac{1}{t}}\\
1 - \frac{1}{2 + t\_1 \cdot t\_1}
\end{array}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 9 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (t) :precision binary64 (let* ((t_1 (- 2.0 (/ (/ 2.0 t) (+ 1.0 (/ 1.0 t)))))) (- 1.0 (/ 1.0 (+ 2.0 (* t_1 t_1))))))
double code(double t) {
double t_1 = 2.0 - ((2.0 / t) / (1.0 + (1.0 / t)));
return 1.0 - (1.0 / (2.0 + (t_1 * t_1)));
}
real(8) function code(t)
real(8), intent (in) :: t
real(8) :: t_1
t_1 = 2.0d0 - ((2.0d0 / t) / (1.0d0 + (1.0d0 / t)))
code = 1.0d0 - (1.0d0 / (2.0d0 + (t_1 * t_1)))
end function
public static double code(double t) {
double t_1 = 2.0 - ((2.0 / t) / (1.0 + (1.0 / t)));
return 1.0 - (1.0 / (2.0 + (t_1 * t_1)));
}
def code(t): t_1 = 2.0 - ((2.0 / t) / (1.0 + (1.0 / t))) return 1.0 - (1.0 / (2.0 + (t_1 * t_1)))
function code(t) t_1 = Float64(2.0 - Float64(Float64(2.0 / t) / Float64(1.0 + Float64(1.0 / t)))) return Float64(1.0 - Float64(1.0 / Float64(2.0 + Float64(t_1 * t_1)))) end
function tmp = code(t) t_1 = 2.0 - ((2.0 / t) / (1.0 + (1.0 / t))); tmp = 1.0 - (1.0 / (2.0 + (t_1 * t_1))); end
code[t_] := Block[{t$95$1 = N[(2.0 - N[(N[(2.0 / t), $MachinePrecision] / N[(1.0 + N[(1.0 / t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, N[(1.0 - N[(1.0 / N[(2.0 + N[(t$95$1 * t$95$1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_1 := 2 - \frac{\frac{2}{t}}{1 + \frac{1}{t}}\\
1 - \frac{1}{2 + t\_1 \cdot t\_1}
\end{array}
\end{array}
(FPCore (t) :precision binary64 (let* ((t_1 (+ 2.0 (/ -2.0 (+ 1.0 t))))) (+ 1.0 (/ -1.0 (fma t_1 t_1 2.0)))))
double code(double t) {
double t_1 = 2.0 + (-2.0 / (1.0 + t));
return 1.0 + (-1.0 / fma(t_1, t_1, 2.0));
}
function code(t) t_1 = Float64(2.0 + Float64(-2.0 / Float64(1.0 + t))) return Float64(1.0 + Float64(-1.0 / fma(t_1, t_1, 2.0))) end
code[t_] := Block[{t$95$1 = N[(2.0 + N[(-2.0 / N[(1.0 + t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, N[(1.0 + N[(-1.0 / N[(t$95$1 * t$95$1 + 2.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_1 := 2 + \frac{-2}{1 + t}\\
1 + \frac{-1}{\mathsf{fma}\left(t\_1, t\_1, 2\right)}
\end{array}
\end{array}
Initial program 100.0%
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lower-fma.f64100.0
Applied rewrites100.0%
lift-fma.f64N/A
lift-/.f64N/A
rgt-mult-inverseN/A
+-commutativeN/A
lower-+.f64100.0
lift-fma.f64N/A
lift-/.f64N/A
rgt-mult-inverseN/A
+-commutativeN/A
lower-+.f64100.0
Applied rewrites100.0%
Final simplification100.0%
(FPCore (t)
:precision binary64
(if (<= (- 2.0 (/ (/ 2.0 t) (- 1.0 (/ -1.0 t)))) 4e-5)
(fma t (fma -2.0 (* t t) t) 0.5)
(-
1.0
(+
(/
(+
0.2222222222222222
(/ (fma t -0.037037037037037035 -0.04938271604938271) (* t t)))
t)
0.16666666666666666))))
double code(double t) {
double tmp;
if ((2.0 - ((2.0 / t) / (1.0 - (-1.0 / t)))) <= 4e-5) {
tmp = fma(t, fma(-2.0, (t * t), t), 0.5);
} else {
tmp = 1.0 - (((0.2222222222222222 + (fma(t, -0.037037037037037035, -0.04938271604938271) / (t * t))) / t) + 0.16666666666666666);
}
return tmp;
}
function code(t) tmp = 0.0 if (Float64(2.0 - Float64(Float64(2.0 / t) / Float64(1.0 - Float64(-1.0 / t)))) <= 4e-5) tmp = fma(t, fma(-2.0, Float64(t * t), t), 0.5); else tmp = Float64(1.0 - Float64(Float64(Float64(0.2222222222222222 + Float64(fma(t, -0.037037037037037035, -0.04938271604938271) / Float64(t * t))) / t) + 0.16666666666666666)); end return tmp end
code[t_] := If[LessEqual[N[(2.0 - N[(N[(2.0 / t), $MachinePrecision] / N[(1.0 - N[(-1.0 / t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 4e-5], N[(t * N[(-2.0 * N[(t * t), $MachinePrecision] + t), $MachinePrecision] + 0.5), $MachinePrecision], N[(1.0 - N[(N[(N[(0.2222222222222222 + N[(N[(t * -0.037037037037037035 + -0.04938271604938271), $MachinePrecision] / N[(t * t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / t), $MachinePrecision] + 0.16666666666666666), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;2 - \frac{\frac{2}{t}}{1 - \frac{-1}{t}} \leq 4 \cdot 10^{-5}:\\
\;\;\;\;\mathsf{fma}\left(t, \mathsf{fma}\left(-2, t \cdot t, t\right), 0.5\right)\\
\mathbf{else}:\\
\;\;\;\;1 - \left(\frac{0.2222222222222222 + \frac{\mathsf{fma}\left(t, -0.037037037037037035, -0.04938271604938271\right)}{t \cdot t}}{t} + 0.16666666666666666\right)\\
\end{array}
\end{array}
if (-.f64 #s(literal 2 binary64) (/.f64 (/.f64 #s(literal 2 binary64) t) (+.f64 #s(literal 1 binary64) (/.f64 #s(literal 1 binary64) t)))) < 4.00000000000000033e-5Initial program 100.0%
Taylor expanded in t around 0
+-commutativeN/A
unpow2N/A
associate-*l*N/A
*-commutativeN/A
lower-fma.f64N/A
+-commutativeN/A
distribute-lft1-inN/A
associate-*l*N/A
unpow2N/A
lower-fma.f64N/A
unpow2N/A
lower-*.f6499.8
Applied rewrites99.8%
if 4.00000000000000033e-5 < (-.f64 #s(literal 2 binary64) (/.f64 (/.f64 #s(literal 2 binary64) t) (+.f64 #s(literal 1 binary64) (/.f64 #s(literal 1 binary64) t)))) Initial program 100.0%
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lower-fma.f64100.0
Applied rewrites100.0%
Taylor expanded in t around inf
+-commutativeN/A
+-commutativeN/A
mul-1-negN/A
unsub-negN/A
associate-*r/N/A
metadata-evalN/A
unpow2N/A
associate-/r*N/A
div-subN/A
unsub-negN/A
mul-1-negN/A
lower-+.f64N/A
Applied rewrites98.8%
Final simplification99.3%
herbie shell --seed 2024228
(FPCore (t)
:name "Kahan p13 Example 3"
:precision binary64
(- 1.0 (/ 1.0 (+ 2.0 (* (- 2.0 (/ (/ 2.0 t) (+ 1.0 (/ 1.0 t)))) (- 2.0 (/ (/ 2.0 t) (+ 1.0 (/ 1.0 t)))))))))