我在 TikZ/PGF 中进行非常简单的计算时遇到了问题。在正确显示许多计算后,我遇到了一个问题,如果我想将 1.6 和 3.8 相加,pgfmathadd 会返回 5.40001,我认为这不是一个真正的问题。如果我在一个数字上加 0.1,在另一个数字上加 -0.1,问题就消失了。我很困惑,我不是 PGF 或 TikZ 方面的专家,而且太担心再次使用它,如果我不能确定计算是否足够精确。我也不知道 1.6 和 3.8 有什么特别之处。
这是一个基本代码,编译后返回以下答案。a)3,8 + 1,6 = 5.40001 b)3,6 + 1,8 = 5.40001 c)3,7 + 1,6 = 5.3 d)3,7 + 1,5 = 5.4 e)3,8 + 1,6 = 5.4 f)3,8 + 1,6 = 5.40001 g)3,8 + 1,6 = 5.40001 h)3,8 + 1,6 = 5.40001
\documentclass[a4paper,11pt]{scrartcl}
\usepackage{amsmath} % Erweiterter Formelsatz - Hauptpaket!
\usepackage{pgfplots}
\usepackage{pgf,tikz}
\begin{document}
\begin{xalignat*}{4}
&a)\,\,3,8+1,6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult &
&b)\,\,3,6+1,8=\pgfmathadd{3.6}{1.8}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult &
&c)\,\, 3,7+1,6=\pgfmathadd{3.7}{1.6}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult &
&d)\,\,3,7+1,5=\pgfmathadd{3.9}{1.5}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult\\
&e)\,\,3,8+1,6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=4]\pgfmathresult &
&f)\,\,3,8+1,6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=5]\pgfmathresult &
&g)\,\,3,8+1,6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult &
&h)\,\,3,8+1,6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=7]\pgfmathresult
\end{xalignat*}
\end{document}
我希望有人能帮助我,因为这会让工作变得容易得多。我用它来做大量的计算,我不想自己做。抱歉我的英语不好。
答案1
如果您打算进行“精确”计算,则必须使用该fpu
库。否则 PGF 会使用不够精确的 TeX 算法。
\documentclass[a4paper,11pt]{scrartcl}
\usepackage{array}
\usepackage{pgf}
\usepgflibrary{fpu}
\pgfkeys{pgf/fpu}
\begin{document}
\begin{tabular}{*{4}{r@{\enspace}>{$}l<{$}}}
a) & 3.8+1.6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult &
b) & 3.6+1.8=\pgfmathadd{3.6}{1.8}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult &
c) & 3.7+1.6=\pgfmathadd{3.7}{1.6}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult &
d) & 3.7+1.5=\pgfmathadd{3.9}{1.5}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult\\
e) & 3.8+1.6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=4]\pgfmathresult &
f) & 3.8+1.6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=5]\pgfmathresult &
g) & 3.8+1.6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=6]\pgfmathresult &
h) & 3.8+1.6=\pgfmathadd{3.8}{1.6}\pgfmathprintnumber[fixed, precision=7]\pgfmathresult
\end{tabular}
\end{document}
或者,您也可以在以下位置使用该fp
库expl3
:
\documentclass[a4paper,11pt]{scrartcl}
\usepackage{array}
\usepackage{xparse}
\ExplSyntaxOn
% #1 = precision (with truncation), optional (default 0)
% #2 = expression
\NewDocumentCommand{\printexpr}{O{0}m}
{
%\fp_to_decimal:n { round0 ( #2, #1 ) } % old syntax
\fp_to_decimal:n { trunc ( #2, #1 ) }
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{*{4}{r@{\enspace}>{$}l<{$}}}
a) & 3.8+1.6=\printexpr[1]{3.8+1.6} &
b) & 3.6+1.8=\printexpr[2]{3.6+1.8} &
c) & 3.7+1.6=\printexpr[2]{3.7+1.6} &
d) & 3.7+1.5=\printexpr[3]{3.7+1.5} \\
e) & 3.8+1.6=\printexpr[4]{3.8+1.6} &
f) & 3.8+1.6=\printexpr[5]{3.8+1.6} &
g) & 3.8+1.6=\printexpr[6]{3.8+1.6} &
h) & 3.8+1.6=\printexpr[7]{3.8+1.6}
\end{tabular}
\end{document}
笔记:自 2013 年 12 月更新套件以来,定点表达式求值语法中的关键字 和expl3
已round-
更改为round+
round0
floor
(是round-
)
ceil
(是round+
)
trunc
(是round0
)