我正在尝试在(La)TeX中实现十进制算术。我正在尝试使用dimens来存储值。我希望算术精确到一些(固定的)小数位数。如果我使用1pt作为我的基本单位,那么这会失败,因为\ divide向下舍入,所以1pt / 10给出0.09999pt。如果我使用像1000sp这样的东西作为我的基本单位,那么我得到了3位小数的定点运算,但我无法找到一种简单的格式化数字的方法。如果我尝试将它们转换为pt,那么我可以使用TeX的显示机制,我对\ divide有同样的问题。
如何解决此问题或解决此问题?
答案 0 :(得分:3)
fp包为LaTeX提供定点运算。 LaTeX3项目目前正在实现类似于explo3 bundle的一部分。该代码目前不在CTAN上,但可以从SVN中获取(或者在从SVN到CTAN的下一次更新发生时出现)。
答案 1 :(得分: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
操作以三个寄存器机器为模型,其中第一个是目标,另外两个是操作数。乘法和除法后的舍入,包括非常大或非常小的数字的拐角情况,留给你练习。