通过 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
答案2
TeX 使用定点运算和 Ti钾Z 利用了这一点。
让我们尝试不同的方法。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}
但四舍五入总会造成阻碍。