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 之间。
根本无法为整数变量赋值超出上述范围的值。
使用“浮点整数”进行运算时,会受到浮点运算标准限制。
同样,改为后randint
,rand
我得到了
该数字与指数和四组四位有效数字一起存储。两个内部函数\s__fp
和\__fp_chk:w
用于(可扩展地)操作数字。终止符;
结束内部表示。
答案2
该数字恰好2147483648
是2^31
,并且\int_...
变量实际上是 TeX 计数寄存器,其具有“有限”的数字范围,就像通常的LaTeX
计数器一样,- 2^{31} to 2^{31} - 1
恰好是2^32
数字。
如果您查看加载了 expl3 的文件的 .log 文件,您将看到\int...
宏实际上是\countXYZ
定义。
尝试存储2147483648
也会产生溢出\setcounter{foo}{2147483648}
。
浮点数以不同的方式存储为维度寄存器并允许更大的数字,但准确性并不会更好。
请查看LaTeX 计数器中可以保存的最大整数是多少?也一样。