17

I would like to get the square root of a number which I have stored into a counter. I have been using the calc package for summation and multiplication operations, but I cannot find anything like

\setcounter{squarerootofmynumber}{\value{mynumber}^{1/2}}

or something like that. Do you know the way?

4
  • 4
    Counters can only store integer values.
    – egreg
    Dec 14, 2012 at 17:36
  • As pointed out by @egreg counters can only store integers. I'm not aware of a package that helps approximating squre roots. What do you need this for?
    – user10274
    Dec 14, 2012 at 17:39
  • There are a range of packages that let you calculate square roots (expl3's l3fp module, calculator, fp) but that won't help for storing the results in a counter for the reasons already mentioned.
    – cgnieder
    Dec 14, 2012 at 17:50
  • 2
    With \usepackage{pgf}, you can use \pgfmathsetmacro{\squarerootofmynumber}{sqrt(\value{mynumber})}. Dec 14, 2012 at 18:02

3 Answers 3

23

Here are four ways for calculating the square root of a number (with varying precision). However, the result cannot be stored in a counter unless it is an integer.

  1. The calculator package

    \documentclass{article}
    \usepackage{calculator}
    \newcounter{mycount}
    \setcounter{mycount}{7}
    \begin{document}
    \SQUAREROOT{\themycount}{\solution}%
    $\sqrt{\themycount}=\solution$
    \end{document}
    
  2. The fp package

    \documentclass{article}
    \usepackage{fp}
    \newcounter{mycount}
    \setcounter{mycount}{7}
    \begin{document}
    \FProot\solution{\themycount}{2}%
    \FPround\solution\solution{5}%
    $\sqrt{\themycount}=\solution$
    \end{document}
    
  3. The pgf package (thanks to Peter Grill for the reminder)

    \documentclass{article}
    \usepackage{pgf}
    \newcounter{mycount}
    \setcounter{mycount}{7}
    \begin{document}
    \pgfmathsetmacro{\solution}{sqrt(\themycount)}%
    $\sqrt{\themycount}=\solution$
    \end{document}
    
  4. The l3fp module of the l3kernel

    \documentclass{article}
    \usepackage{expl3}
    \ExplSyntaxOn
    \cs_new_eq:NN \calculate \fp_eval:n
    \ExplSyntaxOff
    \newcounter{mycount}
    \setcounter{mycount}{7}
    \begin{document}
    $\sqrt{\themycount}=\calculate{round(sqrt(\themycount),5)}$
    \end{document}
    

All of these examples give

enter image description here

Storing the result in a counter requires the result to be an integer. Packages 2-4 have means to round a result which would allow to set a counter afterwards. Here is an example with l3fp:

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \calculate \fp_eval:n
\ExplSyntaxOff
\begin{document}
\newcounter{mycount}
\setcounter{mycount}{7}
\edef\solution{\calculate{round(sqrt(\value{mycount}),0)}}
\setcounter{mycount}{\solution}\themycount
\end{document}
4
  • You can \usepackage{pgfmath} if you only want the calc features, and not the whole drawing engine. Perhaps also is worth to mention that if you have tikz or beamer, then pgfmath is already loaded.
    – JLDiaz
    Dec 14, 2012 at 19:05
  • @JLDiaz I tried that with the example above but it gave ! Undefined control sequence. l.108 \pgfkeys and I was to lazy to investigate why that was...
    – cgnieder
    Dec 14, 2012 at 19:07
  • You are right. Then it does not work as advertised in the manual :(
    – JLDiaz
    Dec 14, 2012 at 19:13
  • 2
    Nice answer. As far as pgfmath see: Is it possible to load pgfmath without loading the full pgf package?. Dec 14, 2012 at 19:36
17

a solution with lualatex with a good precision

\documentclass{minimal}
\newcounter{mycount} \setcounter{mycount}{7}
\begin{document}

\directlua{tex.print(math.sqrt(\themycount))}

\end{document}

enter image description here

5

Using the sqrt function which is provided with the xintexpr package you can calculate square roots with arbitrary precisions.

I have updated this answer to illustrate use of the new [P] optional argument to \xintfloatexpr (v1.1) and rounded integral square root in \xintiiexpr (v1.1a).

Also, one can use directly the underlying macros from packages xint and xintfrac. See the documentation.

\documentclass{article}
\usepackage{xintexpr}
\begin{document}

$\sqrt{17}$ with various precisions:


% Square root with 16 digits of precision:
\xintthefloatexpr sqrt(17)\relax

% If you have a LaTeX counter, use \value:
\newcounter{cnt}
\setcounter{cnt}{17}

% \xintthefloatexpr sqrt(\value{cnt})\relax

% Square root with more digits:
\xintthefloatexpr [24] sqrt(17,24)\relax
% The 24 is needed twice, once for sqrt to compute with 
%  24 digits, and once for \xintthefloatexpr not to
%  round to only 16 digits.
% The [24] requires xintexpr v1.1 or later.

% Or change globally the precision:
\xintDigits := 48;
\xintthefloatexpr sqrt(17)\relax

% There is a variant which works only with (big) integers.
% You can use choose between sqrt which truncates and sqrtr
% which rounds. The latter requires xintexpr v1.1a or later.

Integer approximation to $\sqrt{170000000000000000}$:

\xinttheiiexpr sqrt(170000000000000000)\relax{} (truncated using \verb|sqrt|)

\xinttheiiexpr sqrtr(170000000000000000)\relax{} (rounded using \verb|sqrtr|)% v1.1a or later

% This can be put in a LaTeX counter if <2^31.

A counter can not hold larger than $\number"7FFFFFFF$.

\setcounter{cnt}{\xinttheiiexpr sqrtr(170000000000000000)\relax}
The counter holds: $\thecnt\approx \sqrt{170000000000000000}$.

\setcounter{cnt}{\xinttheiiexpr sqrtr(1700000000000000000)\relax}
The counter holds $\thecnt\approx \sqrt{1700000000000000000}$.

% Rather than expressions with the function sqrt, one
% can also use directly the underlying macros provided 
% by xint and xintfrac package. See xint documentation.
\end{document}

square roots

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .