“尺寸太大”错误的起源和形成

“尺寸太大”错误的起源和形成

当我尝试编译时:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[very thin, red] (0,0) circle (2);
\foreach \i in {0, 1, 2, ..., 46} \draw[very thin, red] ({360 * \i / 100}:1) circle (1);
\end{tikzpicture}
\end{document}

我有:

! Dimension too large.
<recently read> \pgfmath@x 

l.6 ...thin, red] ({360 * \i / 100}:1) circle (1);

I can't work with sizes bigger than about 19 feet.
Continue and I'll use the largest value I can.

如果我转到4645比如说\foreach \i in {0, 1, 2, ..., 45},该代码将通过编译。

似乎我尝试计算的某些值大于 TeX 引擎可以处理的值。

在 TeX.SX 上搜索了大约半个小时后,我找到了这些问题虽然解决了,但问题的根源和结构仍不清楚。因此,我决定提出这个问题:极限(它的根源和形成)是什么,我该如何避免它。

任何线索都将受到感激。

答案1

TeX 尺寸算法是定点算法,基于整数算法缩放点 sp.2^{16}sp=65536sp=1pt .

可存储的最大尺寸以纯 TeX 和 LaTeX 格式保存为\maxdimen2^{30}sp = 16384pt ~ 18.9ft。

基本算术(例如由 实现的\dimexpr)计算中的每个子项(而不仅仅是最终答案)都需要在 +/- 范围内\maxdimen

浮点包(例如fp或)l3fp可以处理浮点值和更大的范围,但这样做是通过避免使用 TeX dimen 寄存器并在宏中维护值并“手动”进行计算来实现的。

除了限制绝对值之外,这种转换为整数sp算法的转换还限制了精度,例如 360/100 将被编码为 360pt/100 即 65536*360sp / 100,这在整数算法中已经无法准确计算。对于排版测量,少数舍入误差sp实际上是肉眼看不见的,因此无关紧要,但是,如果 TeX 算法用于更广泛的计算,就会出现这些问题,正如您所发现的那样。

相关内容