如何计算 tikz 中大于 16383 的数字?

如何计算 tikz 中大于 16383 的数字?

我试图输出从 2^10=1024 开始的 2 的正整数幂。我遇到了一个Dimension too large错误。当我强制编译时,2^14=16384 中的每个数字都输出为 16383。我猜 16384 刚好超出了引擎覆盖的默认数字范围,溢出会引发错误。我该怎么做才能计算更大的数字?在 2022 年,16383 根本不够。

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

\begin{tikzpicture}
    \foreach \i in {10,...,20} {
        \node at (\i,0) {\pgfmathprint{int(2^\i)}};
    }
\end{tikzpicture}

\end{document}

答案1

您可以使用该bigintcalc包(但对于非常大的指数可能会花费一些时间)。

\documentclass{article}
\usepackage{bigintcalc}
\begin{document}
\bigintcalcPow{2}{999}
\end{document}

生成:

在此处输入图片描述

(该数字有点太大,页面容纳不下……)

答案2

pgfmath使用不同于你发现的定点系统的数学引擎(顺便说一句,它是手册中记录)。

例如,您可以使用 LaTeX3 引擎(浮点,IEEE 754,因此您必须考虑到考虑准确性):

\documentclass{article}
\usepackage{tikz}
\usepackage{xfp}% not needed in recent LaTeX, thanks @egreg!
\begin{document}

\begin{tikzpicture}
    \foreach \i in {10,...,30} {
        \node at (0,0.5*\i) {\fpeval{2**\i}};
    }
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

有宏包可以实现更好的算法。例如,apnum.tex以任意精度实现任意大数。此宏包仅使用经典 TeX 基元实现。请参阅texdoc apnum

你可以试试:

\input apnum

\newcount\tmpnum \tmpnum=1
\def\A{2}
\loop
   \the\tmpnum: \A \par
   \ifnum\tmpnum<100 \advance\tmpnum by1 \evaldef\A{2*\A} \repeat

答案4

如果您可以自由使用 LuaLaTeX,整个 Lua 数学库都可供您使用。

\documentclass{article}
\begin{document}
\directlua{
  for i = 10,50 do
    tex.print ( i .. '\\ ' .. math.floor(2^i) .. '\\par')
  end
}
\end{document}

因为 Lua 将\(反斜杠)视为主要转义字符,所以必须输入\\才能强制将单个反斜杠字符传递给 LaTeX。

在旁边:如果练习的唯一目的是计算 2 的幂,那么从 开始2^{10},通过在循环的每一轮中执行乘法而不是指数运算,Lua 代码可以变得更高效一些for

j = math.floor(2^9)  % initialize 'j' as 2^(10-1)
for i = 10,50 do
  j = 2*j
  tex.print ( i .. '\\ ' .. j .. '\\par')
end

结果输出的前十五行是:

在此处输入图片描述

相关内容