如何在没有赋值的情况下进行算术运算?

如何在没有赋值的情况下进行算术运算?

我知道我可以使用“advance...by...”在 TeX 中对数字进行运算,但是有没有办法在不改变数字值的情况下进行运算呢?例如,如果我想确定一个数字 X 是否满足 x^2+x+1<0,并且保留 X 的原值以备将来使用,我该怎么做?

答案1

例如,您可以使用 xfp:

\documentclass{article}
\usepackage{xfp}
\newcommand\myxvalue{15}

\begin{document}

\ifnum \fpeval{\myxvalue^2 + \myxvalue + 1} < 0 \relax 
        yes  
\else no: it is \fpeval{\myxvalue^2 + \myxvalue + 1} 
\fi

\end{document}

答案2

xfp包是包装器,用于在用户级访问 LaTeX3 的“浮点单元”。其所有操作都是可扩展的。

在核心层面上,他们关键性地使用了 Knuth TeX 的 e-TeX 附加功能\numexpr\dimexpr... 它允许使用中缀符号进行可扩展计算(有时还有一些令人惊讶的限制)。

直接使用\numexpr/\dimexpr可能就是您所需要的。

也许你需要计算大于的整数2^31,并且你想要^运算符?和阶乘!?那么你可以使用数值表达式

对于更复杂的事情,例如add(x(x+1), x=1..100)你可以使用xintexpr

早期的软件包允许进行包括幂在内的可扩展计算,intcalc但没有中缀符号,只有宏。bigintcalc它还可以处理超出2^31界限的整数(intcalc即使 TeX 引擎缺少 e-TeX 也能实现可扩展计算\numexpr;这在理论上很有趣,但在实践中却相当慢。\numexpr如果后者可用,它确实会使用)。

如上所述,xintexpr它扩展了中缀语法(并且在使用“大”数字计算时速度更快)。bnumexpr是一个更轻量级的包,它也与提供的核心算法挂钩xintcore,但不会像那样开发广泛的语法 xintexpr

自然而然地,在某个时候,你会想要将计算结果实际存储在某个地方,例如通过\edef;因此计算是可扩展的,无需分配,这对于\ifnum,对于\write等等来说都很好......(也用于嵌入一些 TikZ 的东西),但在一天结束时,你几乎总是必须做一些不可扩展的事情......

然后,诸如fppgfmathpgfplots、之类的东西apnum是数学引擎从一开始就不可扩展地执行操作(也许我忘记了一些,请补充)。 是apnum任意精度。

根据你最初的问题,也许是这种风格:

\xintdefvar X := whatever with big integers and fractions;
% 
\xintifboolexpr{X^2 + X + 1 < 0}{Yes branch}{No branch}

第一步是进行可扩展的计算并定义变量 X。然后\xintifboolexpr是纯粹可扩展的并且X^2 + X + 1无需赋值即可进行评估。

xintexpr当然,正如@Skillmon 所观察到的,这里总是采用 No 分支……(到目前为止还没有复数的接口)。

相关内容