数值计算的精度

数值计算的精度

当使用 pgfmathsetmacro 处理非常小的高指数时,它不起作用。下面的示例因除以零而退出。有什么方法可以提高精度吗?或者有其他包可以处理这个例子吗?

\documentclass{article}

\usepackage{tikz}

\begin{document}

\pgfmathsetmacro{\a}{10e-32}
\pgfmathsetmacro{\b}{10e-30}

\pgfmathsetmacro{\c}{\a/\b}
\c
\pgfmathsetmacro{\c}{1/\b}
\c
\end{document}

答案1

由于 TeX 数字的限制,默认数学引擎中的数字范围pgf非常有限。此外,定点算术库对这些指数没有帮助,因为该库仅涵盖小数点前后十位数字。

该示例可以用浮点单元库进行处理:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{fpu}

\begin{document}

\pgfset{fpu}
\pgfmathsetmacro{\a}{10e-32}
\pgfmathsetmacro{\b}{10e-30}

\pgfset{fpu/output format=fixed}
\pgfmathsetmacro{\c}{\a/\b}
\c

\pgfset{fpu/output format=sci}
\pgfmathsetmacro{\c}{1/\b}
\c
\end{document}

结果

答案2

使用更好的浮点管理框架,即 中的框架expl3

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\cs_set_eq:NN \fpeval \fp_eval:n
\ExplSyntaxOff

\begin{document}

\fpeval{10e-32/10e-30}

\end{document}

请注意,与不同pgf,浮点宏是可扩展的。

因此,你可以从

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\cs_set_eq:NN \fpeval \fp_eval:n
\ExplSyntaxOff

\newcommand{\varA}{10e-32}
\newcommand{\varB}{10e-30}

\begin{document}

\fpeval{\varA/\varB}

\end{document}

在此处输入图片描述

请查阅texdoc interface3有关支持的功能和语法的更多信息。

答案3

使用lualatex

\documentclass{article}
\begin{document}    
\directlua{tex.print(10^(-32)/10^(-30))}

\directlua{tex.print(1/10^(-30))}
\end{document}

在此处输入图片描述

相关内容