![数值计算的精度](https://linux22.com/image/336125/%E6%95%B0%E5%80%BC%E8%AE%A1%E7%AE%97%E7%9A%84%E7%B2%BE%E5%BA%A6.png)
当使用 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
有关支持的功能和语法的更多信息。