我知道我可以使用“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 的东西),但在一天结束时,你几乎总是必须做一些不可扩展的事情......
然后,诸如fp
、pgfmath
、pgfplots
、之类的东西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 分支……(到目前为止还没有复数的接口)。