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 計數器中可以保存的最大整數是多少?以及。