
(FPCore (x) :precision binary64 (/ (- 1.0 (cos x)) (* x x)))
double code(double x) {
return (1.0 - cos(x)) / (x * x);
}
real(8) function code(x)
real(8), intent (in) :: x
code = (1.0d0 - cos(x)) / (x * x)
end function
public static double code(double x) {
return (1.0 - Math.cos(x)) / (x * x);
}
def code(x): return (1.0 - math.cos(x)) / (x * x)
function code(x) return Float64(Float64(1.0 - cos(x)) / Float64(x * x)) end
function tmp = code(x) tmp = (1.0 - cos(x)) / (x * x); end
code[x_] := N[(N[(1.0 - N[Cos[x], $MachinePrecision]), $MachinePrecision] / N[(x * x), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1 - \cos x}{x \cdot x}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x) :precision binary64 (/ (- 1.0 (cos x)) (* x x)))
double code(double x) {
return (1.0 - cos(x)) / (x * x);
}
real(8) function code(x)
real(8), intent (in) :: x
code = (1.0d0 - cos(x)) / (x * x)
end function
public static double code(double x) {
return (1.0 - Math.cos(x)) / (x * x);
}
def code(x): return (1.0 - math.cos(x)) / (x * x)
function code(x) return Float64(Float64(1.0 - cos(x)) / Float64(x * x)) end
function tmp = code(x) tmp = (1.0 - cos(x)) / (x * x); end
code[x_] := N[(N[(1.0 - N[Cos[x], $MachinePrecision]), $MachinePrecision] / N[(x * x), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1 - \cos x}{x \cdot x}
\end{array}
(FPCore (x) :precision binary64 (/ (* (/ (sin x) x) (tan (* x 0.5))) x))
double code(double x) {
return ((sin(x) / x) * tan((x * 0.5))) / x;
}
real(8) function code(x)
real(8), intent (in) :: x
code = ((sin(x) / x) * tan((x * 0.5d0))) / x
end function
public static double code(double x) {
return ((Math.sin(x) / x) * Math.tan((x * 0.5))) / x;
}
def code(x): return ((math.sin(x) / x) * math.tan((x * 0.5))) / x
function code(x) return Float64(Float64(Float64(sin(x) / x) * tan(Float64(x * 0.5))) / x) end
function tmp = code(x) tmp = ((sin(x) / x) * tan((x * 0.5))) / x; end
code[x_] := N[(N[(N[(N[Sin[x], $MachinePrecision] / x), $MachinePrecision] * N[Tan[N[(x * 0.5), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / x), $MachinePrecision]
\begin{array}{l}
\\
\frac{\frac{\sin x}{x} \cdot \tan \left(x \cdot 0.5\right)}{x}
\end{array}
Initial program 50.7%
flip--50.6%
div-inv50.5%
metadata-eval50.5%
1-sub-cos73.4%
pow273.4%
Applied egg-rr73.4%
associate-*r/73.4%
*-rgt-identity73.4%
Simplified73.4%
Taylor expanded in x around inf 73.5%
unpow273.5%
*-commutative73.5%
times-frac74.1%
unpow274.1%
hang-0p-tan74.4%
Simplified74.4%
associate-/r*99.7%
associate-*l/99.8%
div-inv99.8%
metadata-eval99.8%
Applied egg-rr99.8%
Final simplification99.8%
(FPCore (x) :precision binary64 (if (<= x 1e-9) 0.5 (* (/ (sin x) (* x x)) (tan (/ x 2.0)))))
double code(double x) {
double tmp;
if (x <= 1e-9) {
tmp = 0.5;
} else {
tmp = (sin(x) / (x * x)) * tan((x / 2.0));
}
return tmp;
}
real(8) function code(x)
real(8), intent (in) :: x
real(8) :: tmp
if (x <= 1d-9) then
tmp = 0.5d0
else
tmp = (sin(x) / (x * x)) * tan((x / 2.0d0))
end if
code = tmp
end function
public static double code(double x) {
double tmp;
if (x <= 1e-9) {
tmp = 0.5;
} else {
tmp = (Math.sin(x) / (x * x)) * Math.tan((x / 2.0));
}
return tmp;
}
def code(x): tmp = 0 if x <= 1e-9: tmp = 0.5 else: tmp = (math.sin(x) / (x * x)) * math.tan((x / 2.0)) return tmp
function code(x) tmp = 0.0 if (x <= 1e-9) tmp = 0.5; else tmp = Float64(Float64(sin(x) / Float64(x * x)) * tan(Float64(x / 2.0))); end return tmp end
function tmp_2 = code(x) tmp = 0.0; if (x <= 1e-9) tmp = 0.5; else tmp = (sin(x) / (x * x)) * tan((x / 2.0)); end tmp_2 = tmp; end
code[x_] := If[LessEqual[x, 1e-9], 0.5, N[(N[(N[Sin[x], $MachinePrecision] / N[(x * x), $MachinePrecision]), $MachinePrecision] * N[Tan[N[(x / 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq 10^{-9}:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;\frac{\sin x}{x \cdot x} \cdot \tan \left(\frac{x}{2}\right)\\
\end{array}
\end{array}
if x < 1.00000000000000006e-9Initial program 35.4%
Taylor expanded in x around 0 66.6%
if 1.00000000000000006e-9 < x Initial program 96.9%
flip--96.5%
div-inv96.4%
metadata-eval96.4%
1-sub-cos98.7%
pow298.7%
Applied egg-rr98.7%
associate-*r/98.8%
*-rgt-identity98.8%
Simplified98.8%
Taylor expanded in x around inf 98.8%
unpow298.8%
*-commutative98.8%
times-frac98.8%
unpow298.8%
hang-0p-tan99.6%
Simplified99.6%
Final simplification74.8%
(FPCore (x) :precision binary64 (if (<= x 5e-7) (+ 0.5 (* -0.041666666666666664 (* x x))) (/ (sin x) (/ (* x x) (tan (* x 0.5))))))
double code(double x) {
double tmp;
if (x <= 5e-7) {
tmp = 0.5 + (-0.041666666666666664 * (x * x));
} else {
tmp = sin(x) / ((x * x) / tan((x * 0.5)));
}
return tmp;
}
real(8) function code(x)
real(8), intent (in) :: x
real(8) :: tmp
if (x <= 5d-7) then
tmp = 0.5d0 + ((-0.041666666666666664d0) * (x * x))
else
tmp = sin(x) / ((x * x) / tan((x * 0.5d0)))
end if
code = tmp
end function
public static double code(double x) {
double tmp;
if (x <= 5e-7) {
tmp = 0.5 + (-0.041666666666666664 * (x * x));
} else {
tmp = Math.sin(x) / ((x * x) / Math.tan((x * 0.5)));
}
return tmp;
}
def code(x): tmp = 0 if x <= 5e-7: tmp = 0.5 + (-0.041666666666666664 * (x * x)) else: tmp = math.sin(x) / ((x * x) / math.tan((x * 0.5))) return tmp
function code(x) tmp = 0.0 if (x <= 5e-7) tmp = Float64(0.5 + Float64(-0.041666666666666664 * Float64(x * x))); else tmp = Float64(sin(x) / Float64(Float64(x * x) / tan(Float64(x * 0.5)))); end return tmp end
function tmp_2 = code(x) tmp = 0.0; if (x <= 5e-7) tmp = 0.5 + (-0.041666666666666664 * (x * x)); else tmp = sin(x) / ((x * x) / tan((x * 0.5))); end tmp_2 = tmp; end
code[x_] := If[LessEqual[x, 5e-7], N[(0.5 + N[(-0.041666666666666664 * N[(x * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[Sin[x], $MachinePrecision] / N[(N[(x * x), $MachinePrecision] / N[Tan[N[(x * 0.5), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq 5 \cdot 10^{-7}:\\
\;\;\;\;0.5 + -0.041666666666666664 \cdot \left(x \cdot x\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\sin x}{\frac{x \cdot x}{\tan \left(x \cdot 0.5\right)}}\\
\end{array}
\end{array}
if x < 4.99999999999999977e-7Initial program 35.4%
Taylor expanded in x around 0 65.8%
unpow265.8%
Simplified65.8%
if 4.99999999999999977e-7 < x Initial program 97.9%
flip--97.5%
div-inv97.3%
metadata-eval97.3%
1-sub-cos98.7%
pow298.7%
Applied egg-rr98.7%
associate-*r/98.8%
*-rgt-identity98.8%
Simplified98.8%
Taylor expanded in x around inf 98.8%
unpow298.8%
*-commutative98.8%
times-frac98.7%
unpow298.7%
hang-0p-tan99.6%
Simplified99.6%
associate-*l/99.5%
associate-/l*99.6%
div-inv99.6%
metadata-eval99.6%
Applied egg-rr99.6%
Final simplification74.1%
(FPCore (x) :precision binary64 (if (<= x 0.0055) (+ 0.5 (* -0.041666666666666664 (* x x))) (/ (- 1.0 (cos x)) (* x x))))
double code(double x) {
double tmp;
if (x <= 0.0055) {
tmp = 0.5 + (-0.041666666666666664 * (x * x));
} else {
tmp = (1.0 - cos(x)) / (x * x);
}
return tmp;
}
real(8) function code(x)
real(8), intent (in) :: x
real(8) :: tmp
if (x <= 0.0055d0) then
tmp = 0.5d0 + ((-0.041666666666666664d0) * (x * x))
else
tmp = (1.0d0 - cos(x)) / (x * x)
end if
code = tmp
end function
public static double code(double x) {
double tmp;
if (x <= 0.0055) {
tmp = 0.5 + (-0.041666666666666664 * (x * x));
} else {
tmp = (1.0 - Math.cos(x)) / (x * x);
}
return tmp;
}
def code(x): tmp = 0 if x <= 0.0055: tmp = 0.5 + (-0.041666666666666664 * (x * x)) else: tmp = (1.0 - math.cos(x)) / (x * x) return tmp
function code(x) tmp = 0.0 if (x <= 0.0055) tmp = Float64(0.5 + Float64(-0.041666666666666664 * Float64(x * x))); else tmp = Float64(Float64(1.0 - cos(x)) / Float64(x * x)); end return tmp end
function tmp_2 = code(x) tmp = 0.0; if (x <= 0.0055) tmp = 0.5 + (-0.041666666666666664 * (x * x)); else tmp = (1.0 - cos(x)) / (x * x); end tmp_2 = tmp; end
code[x_] := If[LessEqual[x, 0.0055], N[(0.5 + N[(-0.041666666666666664 * N[(x * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[(1.0 - N[Cos[x], $MachinePrecision]), $MachinePrecision] / N[(x * x), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq 0.0055:\\
\;\;\;\;0.5 + -0.041666666666666664 \cdot \left(x \cdot x\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{1 - \cos x}{x \cdot x}\\
\end{array}
\end{array}
if x < 0.0054999999999999997Initial program 35.4%
Taylor expanded in x around 0 66.0%
unpow266.0%
Simplified66.0%
if 0.0054999999999999997 < x Initial program 98.7%
Final simplification73.9%
(FPCore (x) :precision binary64 (if (<= x 0.0055) (+ 0.5 (* -0.041666666666666664 (* x x))) (/ (/ (- 1.0 (cos x)) x) x)))
double code(double x) {
double tmp;
if (x <= 0.0055) {
tmp = 0.5 + (-0.041666666666666664 * (x * x));
} else {
tmp = ((1.0 - cos(x)) / x) / x;
}
return tmp;
}
real(8) function code(x)
real(8), intent (in) :: x
real(8) :: tmp
if (x <= 0.0055d0) then
tmp = 0.5d0 + ((-0.041666666666666664d0) * (x * x))
else
tmp = ((1.0d0 - cos(x)) / x) / x
end if
code = tmp
end function
public static double code(double x) {
double tmp;
if (x <= 0.0055) {
tmp = 0.5 + (-0.041666666666666664 * (x * x));
} else {
tmp = ((1.0 - Math.cos(x)) / x) / x;
}
return tmp;
}
def code(x): tmp = 0 if x <= 0.0055: tmp = 0.5 + (-0.041666666666666664 * (x * x)) else: tmp = ((1.0 - math.cos(x)) / x) / x return tmp
function code(x) tmp = 0.0 if (x <= 0.0055) tmp = Float64(0.5 + Float64(-0.041666666666666664 * Float64(x * x))); else tmp = Float64(Float64(Float64(1.0 - cos(x)) / x) / x); end return tmp end
function tmp_2 = code(x) tmp = 0.0; if (x <= 0.0055) tmp = 0.5 + (-0.041666666666666664 * (x * x)); else tmp = ((1.0 - cos(x)) / x) / x; end tmp_2 = tmp; end
code[x_] := If[LessEqual[x, 0.0055], N[(0.5 + N[(-0.041666666666666664 * N[(x * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[(N[(1.0 - N[Cos[x], $MachinePrecision]), $MachinePrecision] / x), $MachinePrecision] / x), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq 0.0055:\\
\;\;\;\;0.5 + -0.041666666666666664 \cdot \left(x \cdot x\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{1 - \cos x}{x}}{x}\\
\end{array}
\end{array}
if x < 0.0054999999999999997Initial program 35.4%
Taylor expanded in x around 0 66.0%
unpow266.0%
Simplified66.0%
if 0.0054999999999999997 < x Initial program 98.7%
associate-/r*98.8%
div-inv98.7%
Applied egg-rr98.7%
un-div-inv98.8%
Applied egg-rr98.8%
Final simplification73.9%
(FPCore (x) :precision binary64 (if (<= x 1.4e+77) 0.5 0.0))
double code(double x) {
double tmp;
if (x <= 1.4e+77) {
tmp = 0.5;
} else {
tmp = 0.0;
}
return tmp;
}
real(8) function code(x)
real(8), intent (in) :: x
real(8) :: tmp
if (x <= 1.4d+77) then
tmp = 0.5d0
else
tmp = 0.0d0
end if
code = tmp
end function
public static double code(double x) {
double tmp;
if (x <= 1.4e+77) {
tmp = 0.5;
} else {
tmp = 0.0;
}
return tmp;
}
def code(x): tmp = 0 if x <= 1.4e+77: tmp = 0.5 else: tmp = 0.0 return tmp
function code(x) tmp = 0.0 if (x <= 1.4e+77) tmp = 0.5; else tmp = 0.0; end return tmp end
function tmp_2 = code(x) tmp = 0.0; if (x <= 1.4e+77) tmp = 0.5; else tmp = 0.0; end tmp_2 = tmp; end
code[x_] := If[LessEqual[x, 1.4e+77], 0.5, 0.0]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq 1.4 \cdot 10^{+77}:\\
\;\;\;\;0.5\\
\mathbf{else}:\\
\;\;\;\;0\\
\end{array}
\end{array}
if x < 1.4e77Initial program 39.9%
Taylor expanded in x around 0 62.4%
if 1.4e77 < x Initial program 98.8%
Taylor expanded in x around 0 66.0%
Taylor expanded in x around 0 66.0%
Final simplification63.1%
(FPCore (x) :precision binary64 0.0)
double code(double x) {
return 0.0;
}
real(8) function code(x)
real(8), intent (in) :: x
code = 0.0d0
end function
public static double code(double x) {
return 0.0;
}
def code(x): return 0.0
function code(x) return 0.0 end
function tmp = code(x) tmp = 0.0; end
code[x_] := 0.0
\begin{array}{l}
\\
0
\end{array}
Initial program 50.7%
Taylor expanded in x around 0 27.3%
Taylor expanded in x around 0 28.1%
Final simplification28.1%
herbie shell --seed 2023207
(FPCore (x)
:name "cos2 (problem 3.4.1)"
:precision binary64
(/ (- 1.0 (cos x)) (* x x)))