LaTeX3 中的整数和浮点精度

LaTeX3 中的整数和浮点精度

L3fp 包建议参数范围randint+- 10^16 - 1;但我似乎被限制为+-2^31 - 1,任何高于该范围的值都会产生Number too big编译错误。另一方面,我获得了预期的完整 16 位十进制精度值fp。为什么?

\documentclass{article}
% RN. 15 April 2017
% BRIEF DESCRIPTION:
%=======================
\usepackage[check-declarations]{expl3}
\usepackage{xparse}
%-----------------------
\ExplSyntaxOn
\int_new:N \l_rn_someInteger_int
\fp_new:N \l_rn_someFp_fp
\NewDocumentCommand\mySetInteger{m}
  {
    \int_set:Nn \l_rn_someInteger_int {#1}
    some~integer:~\int_use:N \l_rn_someInteger_int\\
    \int_set:Nn \l_rn_someInteger_int {\fp_eval:n {randint(#1)}}
    some~random~integer:~\int_use:N \l_rn_someInteger_int\\
    \fp_set:Nn \l_rn_someFp_fp {\fp_eval:n {rand()}}
    some~random~real:~\fp_use:N \l_rn_someFp_fp\\
    -------------------------------------------\\
  }
\ExplSyntaxOff
%-----------------------
\begin{document}
    \mySetInteger{1234}
    \mySetInteger{2147483647}

%   \mySetInteger{2147483648}
%   \mySetInteger{9999999999999999}
\end{document}

答案1

我们可以看看如何l3fp存储浮点表达式:

\documentclass{article}
\usepackage{xfp}

\begin{document}

\ttfamily

\ExplSyntaxOn % we want to do tests

\fp_set:Nn \l_tmpa_fp { randint(10^15,10^15+10^12) }

\fp_eval:n { \l_tmpa_fp }

\par

\cs_meaning:N \l_tmpa_fp

\ExplSyntaxOff

\end{document}

在一次实验中,我得到了

在此处输入图片描述

这表明随机整数并不以 TeX 原有含义上的整数形式存储,因为其范围被限制在 -2 31到 2 31 -1 之间。

根本无法为整数变量赋值超出上述范围的值。

使用“浮点整数”进行运算时,会受到浮点运算标准限制。

同样,改为后randintrand我得到了

在此处输入图片描述

该数字与指数和四组四位有效数字一起存储。两个内部函数\s__fp\__fp_chk:w用于(可扩展地)操作数字。终止符;结束内部表示。

答案2

该数字恰好21474836482^31,并且\int_...变量实际上是 TeX 计数寄存器,其具有“有限”的数字范围,就像通常的LaTeX计数器一样,- 2^{31} to 2^{31} - 1恰好是2^32数字。

如果您查看加载了 expl3 的文件的 .log 文件,您将看到\int...宏实际上是\countXYZ定义。

尝试存储2147483648也会产生溢出\setcounter{foo}{2147483648}

浮点数以不同的方式存储为维度寄存器并允许更大的数字,但准确性并不会更好。

请查看LaTeX 计数器中可以保存的最大整数是多少?也一样。

相关内容