(FPCore (a) :precision binary64 (sqrt (/ (- 1.0 (/ a 300000000.0)) (+ 1.0 (/ a 300000000.0)))))
double code(double a) { return sqrt(((1.0 - (a / 300000000.0)) / (1.0 + (a / 300000000.0)))); }
real(8) function code(a) real(8), intent (in) :: a code = sqrt(((1.0d0 - (a / 300000000.0d0)) / (1.0d0 + (a / 300000000.0d0)))) end function
public static double code(double a) { return Math.sqrt(((1.0 - (a / 300000000.0)) / (1.0 + (a / 300000000.0)))); }
def code(a): return math.sqrt(((1.0 - (a / 300000000.0)) / (1.0 + (a / 300000000.0))))
function code(a) return sqrt(Float64(Float64(1.0 - Float64(a / 300000000.0)) / Float64(1.0 + Float64(a / 300000000.0)))) end
function tmp = code(a) tmp = sqrt(((1.0 - (a / 300000000.0)) / (1.0 + (a / 300000000.0)))); end
code[a_] := N[Sqrt[N[(N[(1.0 - N[(a / 300000000.0), $MachinePrecision]), $MachinePrecision] / N[(1.0 + N[(a / 300000000.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l} \\ \sqrt{\frac{1 - \frac{a}{300000000}}{1 + \frac{a}{300000000}}} \end{array}
Sampling outcomes in binary64 precision:
Herbie found 4 alternatives:
Alternative | Accuracy | Speedup |
---|
(FPCore (a) :precision binary64 (sqrt (/ (- 1.0 (/ a 300000000.0)) (+ 1.0 (/ a 300000000.0)))))
double code(double a) { return sqrt(((1.0 - (a / 300000000.0)) / (1.0 + (a / 300000000.0)))); }
real(8) function code(a) real(8), intent (in) :: a code = sqrt(((1.0d0 - (a / 300000000.0d0)) / (1.0d0 + (a / 300000000.0d0)))) end function
public static double code(double a) { return Math.sqrt(((1.0 - (a / 300000000.0)) / (1.0 + (a / 300000000.0)))); }
def code(a): return math.sqrt(((1.0 - (a / 300000000.0)) / (1.0 + (a / 300000000.0))))
function code(a) return sqrt(Float64(Float64(1.0 - Float64(a / 300000000.0)) / Float64(1.0 + Float64(a / 300000000.0)))) end
function tmp = code(a) tmp = sqrt(((1.0 - (a / 300000000.0)) / (1.0 + (a / 300000000.0)))); end
code[a_] := N[Sqrt[N[(N[(1.0 - N[(a / 300000000.0), $MachinePrecision]), $MachinePrecision] / N[(1.0 + N[(a / 300000000.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l} \\ \sqrt{\frac{1 - \frac{a}{300000000}}{1 + \frac{a}{300000000}}} \end{array}
(FPCore (a) :precision binary64 (fma (fma (fma -1.8518518518518517e-26 a 5.5555555555555555e-18) a -3.3333333333333334e-9) a 1.0))
double code(double a) { return fma(fma(fma(-1.8518518518518517e-26, a, 5.5555555555555555e-18), a, -3.3333333333333334e-9), a, 1.0); }
function code(a) return fma(fma(fma(-1.8518518518518517e-26, a, 5.5555555555555555e-18), a, -3.3333333333333334e-9), a, 1.0) end
code[a_] := N[(N[(N[(-1.8518518518518517e-26 * a + 5.5555555555555555e-18), $MachinePrecision] * a + -3.3333333333333334e-9), $MachinePrecision] * a + 1.0), $MachinePrecision]
\begin{array}{l} \\ \mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(-1.8518518518518517 \cdot 10^{-26}, a, 5.5555555555555555 \cdot 10^{-18}\right), a, -3.3333333333333334 \cdot 10^{-9}\right), a, 1\right) \end{array}
Initial program 100.0%
Taylor expanded in a around 0
+-commutative
N/A
*-commutative
N/A
lower-fma.f64
N/A
sub-neg
N/A
*-commutative
N/A
metadata-eval
N/A
lower-fma.f64
N/A
+-commutative
N/A
lower-fma.f64
100.0
Applied rewrites100.0%
(FPCore (a) :precision binary64 (fma (fma 5.5555555555555555e-18 a -3.3333333333333334e-9) a 1.0))
double code(double a) { return fma(fma(5.5555555555555555e-18, a, -3.3333333333333334e-9), a, 1.0); }
function code(a) return fma(fma(5.5555555555555555e-18, a, -3.3333333333333334e-9), a, 1.0) end
code[a_] := N[(N[(5.5555555555555555e-18 * a + -3.3333333333333334e-9), $MachinePrecision] * a + 1.0), $MachinePrecision]
\begin{array}{l} \\ \mathsf{fma}\left(\mathsf{fma}\left(5.5555555555555555 \cdot 10^{-18}, a, -3.3333333333333334 \cdot 10^{-9}\right), a, 1\right) \end{array}
Initial program 100.0%
Taylor expanded in a around 0
+-commutative
N/A
*-commutative
N/A
lower-fma.f64
N/A
sub-neg
N/A
metadata-eval
N/A
lower-fma.f64
100.0
Applied rewrites100.0%
(FPCore (a) :precision binary64 (fma -3.3333333333333334e-9 a 1.0))
double code(double a) { return fma(-3.3333333333333334e-9, a, 1.0); }
function code(a) return fma(-3.3333333333333334e-9, a, 1.0) end
code[a_] := N[(-3.3333333333333334e-9 * a + 1.0), $MachinePrecision]
\begin{array}{l} \\ \mathsf{fma}\left(-3.3333333333333334 \cdot 10^{-9}, a, 1\right) \end{array}
Initial program 100.0%
Taylor expanded in a around 0
+-commutative
N/A
*-commutative
N/A
lower-fma.f64
N/A
sub-neg
N/A
metadata-eval
N/A
lower-fma.f64
100.0
Applied rewrites100.0%
Taylor expanded in a around 0
Applied rewrites99.8%
(FPCore (a) :precision binary64 1.0)
double code(double a) { return 1.0; }
real(8) function code(a) real(8), intent (in) :: a code = 1.0d0 end function
public static double code(double a) { return 1.0; }
def code(a): return 1.0
function code(a) return 1.0 end
function tmp = code(a) tmp = 1.0; end
code[a_] := 1.0
\begin{array}{l} \\ 1 \end{array}
Initial program 100.0%
Taylor expanded in a around 0
+-commutative
N/A
*-commutative
N/A
lower-fma.f64
N/A
sub-neg
N/A
metadata-eval
N/A
lower-fma.f64
100.0
Applied rewrites100.0%
Taylor expanded in a around 0
Applied rewrites98.8%
herbie shell --seed 1
(FPCore (a)
:name "sqrt((1-a/3e8)/(1+a/3e8))"
:precision binary64
:pre (and (<= -15000.0 a) (<= a 15000.0))
(sqrt (/ (- 1.0 (/ a 300000000.0)) (+ 1.0 (/ a 300000000.0)))))