pgfplotstable,舍入误差

pgfplotstable,舍入误差

我想在我的表中做一些简单的计算,但似乎我看到了一些舍入误差。

有人知道 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}

相关内容