浮点计算问题(使用 pgfmathparse 通过长度)

浮点计算问题(使用 pgfmathparse 通过长度)

通过 sbox 计算的输入高度(在本例中 = 116.43562 pt)和 17.68 pt 相减会在第五个浮点处产生错误的结果。

这是完整的 tex 文件

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgf,tikz} 

\newsavebox{\mybox}
\newlength{\myboxht}

\newcommand{\myfunction}[1]{%
\sbox{\mybox}{%
\begin{minipage}[b]{\linewidth}
#1
\end{minipage}%
}

\setlength{\myboxht}{\ht\mybox}%
\pgfmathparse{\myboxht-17.68pt}% 
\usebox{\mybox}

The height: \the\myboxht

Result of mathematical operation: \pgfmathresult
}

\begin{document}
\myfunction{
Test

\begin{tikzpicture}
    \draw (0,0)--(5,3.3);
\end{tikzpicture}

Test}
\end{document}

使用 PDFLatex 进行编译可得:

在此处输入图片描述

有没有办法控制浮点数?

答案1

Tikz 使用定点算法。您可以使用fptikz 库,但即使完全没有算法,您也不能期望小数点后 5 位的精度。

\documentclass{article}

\begin{document}

\dimen0=98.75561pt \the\dimen0

\end{document}

在此处输入图片描述

只需分配一个值并将其打印出来,小数点后第 5 位从 1 变为 2。TeX 长度始终是整数倍数,1sp因此您不能存储每个 .00001pt 值。

答案2

TeX 使用定点运算和 TiZ 利用了这一点。

让我们尝试不同的方法。TeX 计算出框的高度为 116.43562pt,即 7630725 个缩放点(我让 TeX 显示这一点)。同样,17.68pt 是 1158676 个缩放点。减法是 6472049 个缩放点。

键入\dimen0=6472049sp然后\showthe\dimen0会导致 TeX 显示 98.75563pt,这是 TeX 算法的工作原理。如果我们用计算器

116.43562*65536=7630724.79232
17.68*65536=1158676.48

因此您会看到 TeX 将第一个维度向上舍入,将第二个维度向下舍入,这解释了第五位小数的差异。

实际上,TeX 计算高度确切地如 7630725,但显示的值是最接近除以 65536 的值,有五位小数。您可以尝试:

\dimen0=116.43563pt \showthe\dimen0

要得到

*\dimen0=116.43563pt \showthe\dimen0
> 116.43562pt.

并非所有具有五位小数的数字都对应整数个缩放点。

就 TeX 而言,计算是精确的。如果要进行浮点运算,可以使用\fpeval

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgf,tikz} 

\newsavebox{\mybox}
\newlength{\myboxht}

\newcommand{\myfunction}[1]{%
\sbox{\mybox}{%
\begin{minipage}[b]{\linewidth}
#1
\end{minipage}%
}

\setlength{\myboxht}{\ht\mybox}%
\edef\pgfmathresult{\fpeval{round(\myboxht-17.68pt,5)pt}}%
\usebox{\mybox}

The height: \the\myboxht

Result of mathematical operation: \pgfmathresult
}

\begin{document}
\myfunction{
Test

\begin{tikzpicture}
    \draw (0,0)--(5,3.3);
\end{tikzpicture}

Test}
\end{document}

在此处输入图片描述

但四舍五入总会造成阻碍。

相关内容