我想在我的表中做一些简单的计算,但似乎我看到了一些舍入误差。
有人知道 pgfplotstable 内部使用的精度吗?除了以下非常丑陋的黑客攻击之外,还有其他解决方法吗?我实际上不知道它为什么会起作用?
以下是我的具体 MWE:
\documentclass{article}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread[col sep = comma]{
a, b,
640000, 3200,
1920000, 3200,
3200000, 3200,
6400000, 3200,
12800000, 3200,
} \data
\begin{table}
\pgfplotstableset{create on use/c/.style={create col/expr={2*\thisrow{a}+5*\thisrow{b}}}}
\pgfplotstableset{create on use/d/.style={create col/expr={(2*(\thisrow{a}*256)+5*(\thisrow{b}*256))/256}}}
\pgfplotstabletypeset[columns={a,b,c,d},
columns/a/.style={column name={a}, fixed, precision=0, column type={r|}, },
columns/b/.style={column name={b}, fixed, precision=0, column type={r|}, },
columns/c/.style={column name={formular}, fixed, precision=0, column type={r|}, },
columns/d/.style={column name={Hack}, fixed, precision=0, column type={r|}, },
]{\data}
\end{table}
\end{document}
非常感谢,Juhui
答案1
这是一个(标准)舍入问题。如果您在带有 s 的 C 程序中计算这些数字,您可能会看到同样的情况float
。
解决方案是使用具有更高精度的其他数学解析器(如Jake的答案)或对结果进行四舍五入。
由于您无法轻松提高 pgfplotstable 中例程的精度,因此您可以对结果进行四舍五入……这对于这种情况是可行的。解决方案是使用fixed relative
:它会四舍五入到第一个<precision>
非零数字。如果您使用 5 或 6 作为精度,则您拥有数学解析器的精度。在我看来,这相当合理。
\documentclass{article}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread[col sep = comma]{
a, b,
640000, 3200,
1920000, 3200,
3200000, 3200,
6400000, 3200,
12800000, 3200,
} \data
\begin{table}
\pgfplotstableset{create on use/c/.style={create col/expr={2*\thisrow{a}+5*\thisrow{b}}}}
\pgfplotstableset{create on use/d/.style={create col/expr={(2*(\thisrow{a}*256)+5*(\thisrow{b}*256))/256}}}
\pgfplotstabletypeset[columns={a,b,c,c,d},
columns/a/.style={column name={a}, fixed, precision=0, column type={r|}, },
columns/b/.style={column name={b}, fixed, precision=0, column type={r|}, },
columns/c/.style={column name={formular}, fixed, precision=0, column type={r|}, },
display columns/3/.style={
column name={formular*},
fixed relative, precision=5,
column type={r|},
},
columns/d/.style={column name={Hack}, fixed, precision=0, column type={r|}, },
]{\data}
\end{table}
\end{document}
请注意,数字打印机中也有一个relative
样式。如果这样就更好了——但我设计得有点笨,而且只能在下一个版本中修复(目前,它适用于小于 1 的数字)。
答案2
这不是一个真正的答案,而是一个可能对您可行的解决方法:如果您可以使用lualatex
而不是pdflatex
,则可以使用\directlua
语句进行计算:
\documentclass{article}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread[col sep = comma]{
a, b,
640000, 3200,
1920000, 3200,
3200000, 3200,
6400000, 3200,
12800000, 3200,
} \data
\begin{table}
\pgfplotstableset{create on use/c/.style={create col/expr={\directlua{tex.sprint(2*\thisrow{a}+5*\thisrow{b})}}}}
\pgfplotstableset{create on use/d/.style={create col/expr={(2*(\thisrow{a}*256)+5*(\thisrow{b}*256))/256}}}
\pgfplotstabletypeset[columns={a,b,c,d},
columns/a/.style={column name={a}, fixed, precision=0, column type={r|}, },
columns/b/.style={column name={b}, fixed, precision=0, column type={r|}, },
columns/c/.style={column name={Lua}, fixed, precision=0, column type={r|}, },
columns/d/.style={column name={Hack}, fixed, precision=0, column type={r|}, },
]{\data}
\end{table}
\end{document}