我对 Tikz 计算一些数字的方法有误解。我用一些画了一个图scale
。这是一个 MWE:
\documentclass{standalone}
\usepackage[french]{babel}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[yscale=0.1,xscale=25]
\draw[<->] (0.5,0) node[below right]{t} -- (0,0) -- (0,100) node[above left]{x(t)};
%%Graduation
\foreach \t in {0, 0.08, ..., 0.48}{%
\draw (\t,1) -- (\t,-1) node[below]{\t};}
\end{tikzpicture}
\end{document}
我想了想,0.08 x 5 = 0.40
但又没有0.40001
。为什么没有出现 0.48 这个数字?
我猜想该xscale
因素与这个问题无关,但我无法通过改变该因素来解决问题。否则,我在以下所有图表中都有一个系数。
我读过这篇文章邮政具有pgf
统一的相对精度,约为 4-5 位正确数字。 Tikz 也是这样吗? 有没有办法提高 Tikz 的精度?
谢谢你的帮助!
答案1
精度有限是一个障碍。
使用 ,您可以获得更高的准确性expl3
。
\documentclass{standalone}
\usepackage{tikz}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\fpforeach}{mmmm}
{% #1 = start, #2 = step, #3 = end, #4 = what to do
\fp_step_inline:nnnn { #1 } { #2 } { #3 } { #4 }
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}[yscale=0.1,xscale=25]
\draw[<->] (0.5,0) node[below right]{t} -- (0,0) -- (0,100) node[above left]{x(t)};
%%Graduation
\fpforeach{0}{0.08}{0.48}
{
\draw (#1,1) -- (#1,-1) node[below]{#1};
}
\end{tikzpicture}
\end{document}
不过,要小心除法,因为问题仍然存在,而且由于准确性问题,最后一步可能会丢失,但这是所有浮点计算的问题。
答案2
Tikz 手册指出这是正常的,我引用(第 902 页):
通常,当
...
遇到一个列表项时,它之前应该已经有两个列表项,即数字。数字的示例有 1、-10 或 -0.24。我们把这些数字称为x
和,y
并设d := y − x
它们的差为。接下来,三个点后面还应该有一个数字,我们把这个数字称为z
。在这种情况下,列表阅读的部分
x,y,...,z
被替换为x, x + d, x + 2d, x + 3d, ..., x + md
最后的点是语义点,而不是句法点。m 的值是x + md ≤ z
d 为正或x + md ≥ z
d 为负时的最大数字。也许最好通过一些例子来解释这一点:以下
<list>
具有相同的效果:
\foreach \x in {1,2,...,6} {\x, } yields 1, 2, 3, 4, 5, 6
\foreach \x in {1,2,3,...,6} {\x, } yields 1, 2, 3, 4, 5, 6
\foreach \x in {1,3,...,11} {\x, } yields 1, 3, 5, 7, 9, 11
\foreach \x in {1,3,...,10} {\x, } yields 1, 3, 5, 7, 9
\foreach \x in {0,0.1,...,0.5} {\x, } yields 0, 0.1, 0.20001, 0.30002, 0.40002
\foreach \x in {a,b,9,8,...,1,2,2.125,...,2.5} {\x, } yields a, b, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 2.125, 2.25, 2.375, 2.5
像你一样,我也问了自己这个问题,@egreg 在这里很好地回答了它:为什么 pgffor 在 \foreach 循环中估算出 0.1-0=0.100005 ?
答案3
您可以通过首先处理整数然后重新格式化您想要的十进制表示的数字:
首先,我设置精确对于浮点
\pgfkeys{/pgf/number format/precision=2}
然后在foreach
循环中我使用以下代码将整数解析为所需的小数
\pgfmathparse{\t/100}
\pgfmathroundtozerofill{\pgfmathresult}
\pgfmathsetmacro\t{\pgfmathresult}
完整代码如下:
\documentclass{standalone}
\usepackage[french]{babel}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[yscale=0.1,xscale=25]
\draw[<->] (0.5,0) node[below right]{t} -- (0,0) -- (0,100) node[above left]{x(t)};
%%Graduation
\pgfkeys{/pgf/number format/precision=2}
\foreach \t in {0, 8, ..., 48}
{
\pgfmathparse{\t/100}
\pgfmathroundtozerofill{\pgfmathresult}
\pgfmathsetmacro\t{\pgfmathresult}
\draw (\t,1) -- (\t,-1)
node[below]
{\t};
}
\end{tikzpicture}
\end{document}