2

我正在尝试在(La)TeX 中实现十进制算术。我正在尝试使用尺寸来存储值。我希望算术精确到一些(固定)小数位数。如果我使用 1pt 作为我的基本单位,那么这将失败,因为 \divide 向下舍入,所以 1pt / 10 给出 0.09999pt。如果我使用像 1000sp 这样的东西作为我的基本单位,那么我可以使用 3 个小数位的定点算术,但我想不出一种简单的方法来格式化数字。如果我尝试将它们转换为 pt,这样我就可以使用 TeX 的显示机制,我对 \divide 有同样的问题。

我该如何解决这个问题,或者解决它?

4

2 回答 2

3

fp 包为 LaTeX 提供了定点算法。LaTeX3 项目目前正在实施类似的东西作为 expl3 包的一部分。该代码目前不在 CTAN 上,但可以从 SVN 中获取(或者将在下一次从 SVN 更新到 CTAN 时出现)。

于 2010-07-10T15:19:58.517 回答
2

我会将所有值表示为整数并适当地缩放它们。例如,当您需要三个十进制数字时,0.124将表示为124. 这很好,因为加法和减法是微不足道的。a将两个数字与相乘时b,您必须将结果除以1000以获得正确的表示。通过将结果乘以 来进行除法1000

您仍然必须正确解决舍入问题,但这并不是很困难。至少如果你没有接近最大可表示整数(我不记得它是2^31-1还是2^30-1)。

这是一些代码:

\def\fixadd#1#2#3{%
  #1=#2\relax
  \advance #1 by #3\relax
}
\def\fixsub#1#2#3{%
  #1=#2\relax
  #1=-#1\relax
  \advance #1 by #3\relax
  #1=-#1\relax
}
\def\fixmul#1#2#3{%
  #1=#2\relax
  \multiply #1 by #3\relax
  \divide #1 by 1000\relax
}
\def\fixdiv#1#2#3{%
  #1=#2\relax
  \divide #1 by #3\relax
  \multiply #1 by 1000\relax
}

\newcount\numa
\newcount\numb
\newcount\numc

\numa=1414
\numb=2828
\fixmul\numc\numa\numb
\the\numc
\bye

这些操作以三寄存器机器为模型,其中第一个是目标,另外两个是操作数。乘法和除法之后的舍入,包括非常大或非常小的数字的极端情况,留给您作为练习。

于 2010-07-09T21:18:19.203 回答