L3fp パッケージは、randint
パラメータの範囲を とすることを提案しています+- 10^16 - 1
が、 に制限されているようで+-2^31 - 1
、それを超える値を指定するとNumber too big
コンパイル エラーが発生します。一方、fp
値については、期待どおりの 16 進数桁の精度が得られています。なぜでしょうか。
\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}
ある実験では、
これは、範囲が -2 31から 2 31 -1 までに制限されているため、ランダムな整数が TeX の本来の意味で整数として保存されないことを示しています。
整数変数に上記の範囲外の値を割り当てることはできません。
「浮動小数点整数」で演算する場合、演算を実行するときに浮動小数点演算の標準的な制限が適用されます。
同様randint
に に変更した後rand
、
数値は、指数と、仮数部用の 4 桁の 4 つのグループとともに格納されます。 2 つの内部関数\s__fp
と は、\__fp_chk:w
数値を (拡張可能に) 操作するために使用されます。 ターミネータは、;
内部表現を終了します。
答え2
数はちょうど で2147483648
あり2^31
、変数は実際には TeX カウント レジスタであり、通常のカウンター\int_...
と同様に「制限された」数値範囲を持ち、数はちょうどです。LaTeX
- 2^{31} to 2^{31} - 1
2^32
expl3 がロードされたファイルの .log ファイルを調べると、\int...
マクロが実際には定義であることがわかります\countXYZ
。
保存しようとすると、2147483648
同様にオーバーフローが発生します\setcounter{foo}{2147483648}
。
浮動小数点数は次元レジスタとして異なる方法で保存され、より大きな数値を許可しますが、精度は向上しません。
ぜひご覧くださいLaTeX カウンターに保存できる最大の整数はどれくらいですか?同じように。