\pgfmathsetmacro 的尺寸太大

\pgfmathsetmacro 的尺寸太大

我想定义varafterglowepsdownvarafterglowavarafterglowb并在 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是您必须将结果从其自己的浮点符号转换为固定符号。

相关内容