我想导入一些带有参数的数据来参数化一些图。导入表格后,我使用 将表格的特定变量分配给占位符\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
随附的库TikZ
并pgfplots
在内部使用。它允许在 -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
它使用浮点库并处理大数字。