我想定义varafterglowepsdown
,varafterglowa
和varafterglowb
并在 tikz 函数中使用它们,如下所示:
\newcommand{\varafterglowepsdown}{0.0001}
\pgfmathsetmacro{\varafterglowb}{ln(\varafterglowepsdown) - ln(1 + \varafterglowepsdown)}
\pgfmathsetmacro{\varafterglowa}{(1 + \varafterglowepsdown) / exp(\varafterglowb)}
\begin{tikzpicture}[declare function={
% some function using varafterglowa, varafterglowb, and varafterglowepsdown
}]
% some axis definition
\end{tikzpicture}
然而在第三行我收到“尺寸太大”的错误。
我该如何正确定义varafterglowa
?
答案1
一种互补的方法percusse 的回答将使用 LaTeX3 FPU(这以可扩展形式提供了 IEEE 754 浮点实现):
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \fpeval \fp_eval:n
\ExplSyntaxOff
\protected\def\fpset#1#2{\edef#1{\fpeval{#2}}}
\begin{document}
\newcommand{\varafterglowepsdown}{0.0001}
\fpset{\varafterglowb}{ln(\varafterglowepsdown) - ln(1 + \varafterglowepsdown)}
\fpset{\varafterglowa}{(1 + \varafterglowepsdown) / exp(\varafterglowb)}
\varafterglowa
\end{document}
此处的结果是一个“纯”数字,因此在pgf
需要数字的地方应该可以使用。您可以fpeval
在许多地方直接使用,而不必存储结果。
答案2
TeX 对数字的最大限制是正负 16384。因此,除数中任何超过或足够接近零的值都会导致溢出。exp(-9...)
对于 TeX 来说,这实际上是零,并且已经完成。
相反,您可以使用为 TeX 编写的更精确的计算引擎FP
或 TikZ 的内部fpu
库。
\begin{tikzpicture}
\pgfkeys{/pgf/fpu}% Turn on the fp engine
\newcommand{\varafterglowepsdown}{0.0001}
\pgfmathsetmacro{\varafterglowb}{ln(\varafterglowepsdown) - ln(1 + \varafterglowepsdown)}
\pgfmathsetmacro{\varafterglowa}{(1 + \varafterglowepsdown) / exp(\varafterglowb)}
\pgfkeys{/pgf/fpu=false}% Turn it off
\node{\pgfmathfloattofixed\varafterglowa\pgfmathresult};% Show the fixed number
\end{tikzpicture}
缺点fpu
是您必须将结果从其自己的浮点符号转换为固定符号。