O pacote L3fp propõe que a gama de randint
parâmetros seja +- 10^16 - 1
; ainda assim, parece que estou restrito a +-2^31 - 1
qualquer valor acima dele produz o Number too big
erro de compilação. Por outro lado, estou obtendo a precisão esperada de 16 dígitos decimais para fp
os valores. Por que?
\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}
Responder1
Podemos ver como l3fp
armazena uma expressão de ponto flutuante:
\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}
Em um experimento, obtenho
que mostra que o número inteiro aleatório não é armazenado como um número inteiro no significado original do TeX, porque o intervalo é limitado ao intervalo –2 31 a 2 31 –1.
Simplesmente não se pode atribuir a uma variável inteira um valor fora do intervalo mencionado acima.
A operação com “números inteiros de ponto flutuante” está sujeita às limitações padrão da aritmética de ponto flutuante, quando as operações são executadas.
Da mesma forma, depois de mudar randint
para rand
, obtive
O número é armazenado com o expoente e quatro grupos de quatro dígitos para o significando. As duas funções internas \s__fp
e \__fp_chk:w
são usadas para manipular (expansivelmente) o número. Um terminador ;
encerra a representação interna.
Responder2
O número 2147483648
é 2^31
exatamente e \int_...
as variáveis são, na verdade, registradores de contagem TeX, que possuem um intervalo de números 'limitado', assim como LaTeX
os contadores usuais, que são - 2^{31} to 2^{31} - 1
exatamente 2^32
números.
Se você examinar o arquivo .log de um arquivo com expl3 carregado, verá que as \int...
macros são, \countXYZ
na verdade, definições.
Tentar armazenar 2147483648
irá gerar um estouro, como \setcounter{foo}{2147483648}
também aconteceria.
Os números de ponto flutuante são armazenados de forma diferente como registros de dimensão e permitem números maiores, mas a precisão não é melhor.
Por favor, dê uma olhadaQual é o número inteiro máximo que pode ser salvo em um contador LaTeX?também.