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範圍。

人們根本無法為整數變數分配上述範圍之外的值。

執行操作時,使用「浮點整數」進行操作受到浮點算術的標準限制。

同樣,更改randint為後rand,我得到

在此輸入影像描述

該數字與指數和四組四位數字一起儲存。兩個內部函數\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 計數器中可以保存的最大整數是多少?以及。

相關內容