我试图输出从 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
答案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
结果输出的前十五行是: