\pgfmathsetmacro — 尺寸太大(允许的最大值?)

\pgfmathsetmacro — 尺寸太大(允许的最大值?)

我想导入一些带有参数的数据来参数化一些图。导入表格后,我使用 将表格的特定变量分配给占位符\pgfplotstablegetelem。并且它工作正常。直到一些值变得很大:

显然,该命令\pgfmathsetmacro不喜欢大于16383- 的值,因此会出现错误dimension too large。有什么原因吗?是否可以增加该阈值,以便50000- 范围内的数字也被排除在外?

\documentclass{standalone}
\usepackage{pgfplots,pgfplotstable}

\begin{document}
    \begin{tikzpicture}[declare function={test(\tmp) = x/\tmp;}]
        \begin{axis}[samples=100,domain=0:1]
            \pgfmathsetmacro{\tmp}{16383}
            % \pgfmathsetmacro{\tmp}{16384} % Error
            \addplot (x,{test(\tmp)});
        \end{axis}
    \end{tikzpicture}
\end{document}

我查看了dimensions too large这里的其他帖子,但还没有找到令人满意的答案。也许你可以帮助我。谢谢!

答案1

您可以使用fpu随附的库TikZpgfplots在内部使用。它允许在 -1*10^324 到 1*10^324 范围内进行计算:

\documentclass{standalone}
\usepackage{pgfplots}

\begin{document}

\pgfkeys{/pgf/fpu}
\pgfmathparse{16383+1}
\edef\tmp{\pgfmathresult}
\pgfkeys{/pgf/fpu=false}

\begin{tikzpicture}[declare function={test(\tmp) = x/\tmp;}]
    \begin{axis}[samples=100,domain=0:1]
        \addplot (x,{test(\tmp)});
    \end{axis}
\end{tikzpicture}
\end{document}

答案2

来自pgf 手册 2.10csv第694页:

需要注意的是,所有计算在任何时候都不能超过 ±16383.99999,因为底层计算依赖于 TeX 维度。这意味着许多底层计算必然是近似的,而且速度也不是很快。毕竟,TeX 是一种排版语言,不太适合相对高级的数学运算。但是,可以按照第 76 节中的描述更改计算。

来自TeX 书第114页:

16383.99998 pt(TeX 的最大尺寸)

TeX 编程笔记Chirstian Feuersänger 指出

寄存器\dimen使用 32 位缩放整数(即单位为 的“缩放点”)在内部执行算术运算sp。它包含 1 pt = 65536 sp = 2 16  sp。32 位中的一位用作符号。pt 中的总数字范围为 [−(2 30 − 1)/2 16 , (2 30 − 1)/2 16 ] = [−16383.9998, +16383.9998] 1

1请注意,这并不涵盖 32 位整数的完整范围,我不知道为什么

答案3

我想记录一下我的老问题使用 `\pgfmathsetmacro` 和 `ifthenelse` 运算符时出现“缺失数字”错误,其中我发现了另一个不一致之处\pgfmathsetmacro。实际上,根据接受的答案,此命令可以仅有的将相关宏设置为 TeX 尺寸。因此,除了首先是数字的限制之外,它还受到 TeX 算术的限制。特别是,\pgfmathparse{16384}\let\tmp\pgfmathresult即使该值超出了 TeX 的能力,您的代码也可以使用该构造,因为pgfplots它使用浮点库并处理大数字。

相关内容