【问题标题】:(La)TeX Base 10 fixed point arithmetic(La)TeX Base 10 定点算法
【发布时间】:2010-07-09 21:03:58
【问题描述】:

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

如何解决或解决此问题?

【问题讨论】:

    标签: latex decimal math tex


    【解决方案1】:

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

    【讨论】:

    • 我认为我们将在本周将 LaTeX3 实现(目前)发送到 CTAN,所以它将在 TeX Live 2010 中
    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多