Precisión de números enteros y coma flotante en LaTeX3

Precisión de números enteros y coma flotante en LaTeX3

El paquete L3fp propone que el rango de randintparámetros sea +- 10^16 - 1; sin embargo, parece que estoy restringido a +-2^31 - 1, cualquier valor por encima produce el Number too bigerror de compilación. Por otro lado, obtengo la precisión esperada de 16 dígitos decimales para fplos valores. ¿Por qué?

\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}

Respuesta1

Podemos ver cómo l3fpse almacena una expresión de punto flotante:

\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}

En un experimento, obtengo

ingrese la descripción de la imagen aquí

eso muestra que el número entero aleatorio no se almacena como un número entero en el significado original de TeX, porque el rango está limitado al rango –2 31 a 2 31 –1.

Simplemente no se puede asignar a una variable entera un valor fuera del rango mencionado anteriormente.

Operar con “enteros de coma flotante” está sujeto a las limitaciones estándar de la aritmética de coma flotante, cuando se realizan operaciones.

De manera similar, después de cambiar randinta rand, obtuve

ingrese la descripción de la imagen aquí

El número se almacena con el exponente y cuatro grupos de cuatro dígitos para el significado. Las dos funciones internas \s__fpy \__fp_chk:wse utilizan para manipular (ampliablemente) el número. Un terminador ;finaliza la representación interna.

Respuesta2

El número 2147483648es 2^31exactamente y \int_...las variables son en realidad registros de conteo TeX, que tienen un rango de números "limitado", al igual que LaTeXlos contadores habituales, que son - 2^{31} to 2^{31} - 1exactamente 2^32números.

Si observa el archivo .log de un archivo con expl3 cargado, verá que las \int...macros \countXYZen realidad son definiciones.

Intentar almacenar 2147483648generará un desbordamiento y \setcounter{foo}{2147483648}también lo haría.

Los números de coma flotante se almacenan de manera diferente como registros de dimensión y permiten números más grandes, pero la precisión no es mejor.

Por favor echa un vistazo¿Cuál es el número entero máximo que se puede guardar en un contador LaTeX?también.

información relacionada