(La)TeX Base 10定点算术

时间:2010-07-09 21:03:59

标签: latex decimal math tex

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

如何解决此问题或解决此问题?

2 个答案:

答案 0 :(得分:3)

fp包为LaTeX提供定点运算。 LaTeX3项目目前正在实现类似于explo3 bundle的一部分。该代码目前不在CTAN上,但可以从SVN中获取(或者在从SVN到CTAN的下一次更新发生时出现)。

答案 1 :(得分:2)

我会将所有值表示为整数并适当缩放它们。例如,当您需要三位小数时,0.124将表示为124。这很好,因为加法和减法是微不足道的。将两个数字ab相乘时,您必须将结果除以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

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