Precisão de número inteiro e ponto flutuante em LaTeX3

Precisão de número inteiro e ponto flutuante em LaTeX3

O pacote L3fp propõe que a gama de randintparâmetros seja +- 10^16 - 1; ainda assim, parece que estou restrito a +-2^31 - 1qualquer valor acima dele produz o Number too bigerro de compilação. Por outro lado, estou obtendo a precisão esperada de 16 dígitos decimais para fpos 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 l3fparmazena 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

insira a descrição da imagem aqui

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 randintpara rand, obtive

insira a descrição da imagem aqui

O número é armazenado com o expoente e quatro grupos de quatro dígitos para o significando. As duas funções internas \s__fpe \__fp_chk:wsão usadas para manipular (expansivelmente) o número. Um terminador ;encerra a representação interna.

Responder2

O número 2147483648é 2^31exatamente e \int_...as variáveis ​​são, na verdade, registradores de contagem TeX, que possuem um intervalo de números 'limitado', assim como LaTeXos contadores usuais, que são - 2^{31} to 2^{31} - 1exatamente 2^32números.

Se você examinar o arquivo .log de um arquivo com expl3 carregado, verá que as \int...macros são, \countXYZna verdade, definições.

Tentar armazenar 2147483648irá 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.

informação relacionada