我必须承认,我经常因 pgfplots(table) 的有限数值精度问题而感到困惑。我知道这\pgfset{fpu}
会激活 IEEE 双精度单位。此外,最新手册 (v1.15) 指出:
此 FPU 也是 PgfplotsTable 的一部分,并且默认情况下它被激活以创建 col/expr ...
话虽如此,请帮助我理解有关以下 MWE 的问题。请注意 的三种不同表达方式create col/expr={abs(...)}
。
\documentclass{article}
\usepackage{pgfplotstable}
\begin{filecontents}{table.csv}
values
392.50271975
392.5024343
392.5016196
392.5005834
392.4992593
\end{filecontents}
\pgfplotstableread[col sep=comma]{table.csv}\myerrortable
\pgfplotstableset{
create on use/error/.style={
create col/expr={
abs(785/2 )%-\thisrow{values})
%abs(392.5-\thisrow{values})
}
},
}
\begin{document}
\pgfplotstabletypeset[
columns={error},
columns/error/.style={
column name={error},
fixed,
precision=8,
},
]\myerrortable
\end{document}
abs(785/2 )
=392.499
:为什么只打印了三位数字?这看起来不像是使用了 fpu。abs(785/2 -\thisrow{values})
=0.00372, ...
:如您所见,该values
表包含更多精度数字,并且它们被部分使用。由于 的精度有限,错误总是出现在第三位数字中785/2
。那么,为什么785/2
限制为 3 位数字,而 限制values
为 5 位数字呢?abs(392. - \thisrow{values})
=0.00272, ...
:如果直接使用 785/2 的正确结果,则输出现在对于给定的 5 个精度数字是正确的。但为什么只有 5 位数字?values
列包含更多数字,而我要求 8 位。我以为 fpu 给出了完整的双倍的精确?
答案1
您可以使用expl3
FPU 来解决这个问题(例如,如何使用 TikZ fpu 库?)。
梅威瑟:
\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.15}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \fpeval \fp_eval:n
\ExplSyntaxOff
\begin{filecontents}{table.csv}
values
392.50271975
392.5024343
392.5016196
392.5005834
392.4992593
\end{filecontents}
\pgfplotstableread[col sep=comma]{table.csv}\myerrortable
\pgfplotstableset{
create on use/error/.style={
create col/expr={
\fpeval{abs(785/2-\thisrow{values})}
}
},
}
\begin{document}
\pgfplotstabletypeset[
columns={values,error},
columns/values/.style={column name={value},fixed,precision=8,},
columns/error/.style={column name={error},fixed,precision=8,},
]\myerrortable
\end{document}
结果: