TeX 中如何实现浮点运算

TeX 中如何实现浮点运算

TeXbook 说 TeX 仅使用单位非常小的定点算术/整数算术(对于我们的目的来说本质上是相同的)。为什么现代 TeX 变体不支持浮点运算?还说没有 TeX 变体支持浮点。但许多软件包(包括 TikZ)都使用浮点。浮点是否以宏扩展和整数运算的形式实现?

我已经知道了可以通过 LuaTeX 使用真正的浮点运算, 然后对于大量使用 FP 的用户来说,这可以提高速度,所以答案似乎很清楚——但如果有一个直接的答案就更好了。

动机: 这个问题是在选择硬件以获得最佳 LaTeX 编译性能的技巧(具体来说,此评论)。具体而言,这表明如果 TeX 用户使用 LuaTeX 及其针对其优化的软件包,那么 FP 性能对他们来说就不是那么重要了。

答案1

在原始级别,TeX(LuaTeX 除外)不提供任何浮点计算支持。我们有 count 和 dimen 寄存器,它们(在某种程度上)方便实现更高级的浮点代码。后者看起来像浮点,因为通常的表示(在 中pt)确实包含小数部分。然而,这些实际上是通过处理整数值来实现的:缩放点(sp)。

根据所需的精度,可以使用dimen寄存器并剥离单位来获得合理的结果。但是,由于精度(5 dp)和范围有限,因此这最适合速度至关重要的工作。许多更“经典”的 TeX 使用浮点数的工作都是以这种方式完成的,因为在旧系统上,速度提升对于代码的可用性至关重要。

另一种方法是用整数编码所有内容,并在宏级别处理转换。使用 e-TeX,我们可以使用\numexpr,它提供了一些速度和清晰度增益,并允许可扩展的工作。(一个可以在 TeX90 中可扩展地完成所有操作全部宏观层面的数学:例如,各种包都实现了这样的方法bigintcalc。)

这里要注意的关键是性能与它们运行的​​系统无关:一切都在进行中通过相同的整数内部代码。(TeX90 中极少量的系统相关浮点代码是无法访问 对用户来说。

就浮点数的使用而言,大多数较旧的 LaTeX 软件包根本不使用浮点数,或者使用不可扩展的路由通过dimens(trig例如,用于旋转图形)。该fp包可能是更精确方法的宏中最长期的实现,尽管它并没有被包大量使用。为更强大的系统编写的较新代码将更多地使用基于宏的浮点数。明显的例子是 TikZ,它再次使用基于 dimen 的方法作为标准(尽管也有一个更复杂的 FPU)。该expl3语言包括一个可扩展的 FPU(同样用宏编写),并且它正在获得使用:它比基于 dimen 的方法慢,但对于迄今为止已应用的用例而言,这并不是一个大问题。(这里的性能在解析的某些部分也更好,ETC。,因此在一系列操作上与 TikZ 代码大致相当,并且获得了很多精度:参见已知的浮点计算基准?

正如问题中所述,对于大量使用浮点数的情况,TeX 并不是最好的工具,人们应该考虑使用 LuaTeX 或以其他方式进行预处理。

相关内容