TikZ/PGF 中某些数字的加法运算不正确

TikZ/PGF 中某些数字的加法运算不正确

我在 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}

在此处输入图片描述

或者,您也可以在以下位置使用该fpexpl3

\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 月更新套件以来,定点表达式求值语法中的关键字 和expl3round-更改为round+round0

floor(是round-
ceil(是round+
trunc(是round0

相关内容