latex pgfmath 精度

latex pgfmath 精度

使用 pgfmath 函数的正确方法是什么?请参见下面的简单示例:

\documentclass[border=1pt]{standalone}
\usepackage{tikz}
\begin{document}
\pgfmathsetmacro{\x}{3}
\pgfmathsetmacro{\y}{10}
\pgfmathsetlengthmacro{\z}{\x/\y}
$\x \div \y = \z$
\end{document}

输出为:

在此处输入图片描述

  1. 显然,预期输出是 0.3。
  2. 如何删除单位“pt”?

答案1

关于精度:

这是在计算机上计算非整数时常见的问题。简而言之,它们有一个分辨率,即它们可以处理的最小数字,所有数字都是这个分辨率的倍数。这会导致各种舍入误差,如果进行大量计算,这些误差可能会累积起来。

PGF 通常使用 TeX 定点算法,小数部分使用 16 位。计算时,数字被视为整数。其中一个问题是除法是通常的截断整数除法。

TeX 最小可能数字的单位是缩放点 (sp),即 (1/65536)pt 或 0.000015258789pt。3pt 在内部表示为 3*65536sp = 196608sp。将其除以 10 可得到 19660.8sp,但 0.8 会被截断,导致 19660sp。将其缩放为 pt 可得到 0.299987792969pt,显示为“0.29999pt”,因为 TeX 四舍五入为 5 位数字。如果直接输入 0.3,则在内部表示为 19661sp,即 0.300003051758pt,显示为“0.3pt”。

如果您需要更高的精度,可以查看 PGFs fpu 库。

删除 pt 并对输出进行四舍五入:

您使用了\pgfmathsetlengthmacro,它将单位 pt 添加到数字中。相反,您应该使用\pgfmathsetmacro,它只存储数字(不带单位)。

要对数字进行四舍五入,您可以使用 PGF 数字打印宏。这\pgfmathprintnumberto很有用。在您的示例中,它将宏设置为“0.3”。您可能需要查看选项/pgf/number format/fixed/pgf/number format/fixed zerofill以及/pgf/number format/precision设置数字打印。

示例代码:

\documentclass[border=1pt]{standalone}
\usepackage{tikz}
\begin{document}
\pgfmathsetmacro{\x}{3}
\pgfmathsetmacro{\y}{10}
\begin{tabular}{ll}
with \verb|\pgfmathsetlengthmacro|
&
\pgfmathsetlengthmacro{\z}{\x/\y}
$\x \div \y = \z$
\\
with \verb|\pgfmathsethmacro|
&
\pgfmathsetmacro{\z}{\x/\y}
$\x \div \y = \z$
\\
with \verb|\pgfmathparese| and \verb|\pgfmathprintnumberto|
&
\pgfmathparse{\x/\y}\pgfmathprintnumberto{\pgfmathresult}{\z}
$\x \div \y = \z$
\\
with \verb|\pgfmathsethmacro| and \verb|\z| set to 0.3
&
\pgfmathsetmacro{\z}{0.3}
$\x \div \y = \z$
\end{tabular}
\end{document}

结果:

在此处输入图片描述

相关内容