El paquete L3fp propone que el rango de randint
parámetros sea +- 10^16 - 1
; sin embargo, parece que estoy restringido a +-2^31 - 1
, cualquier valor por encima produce el Number too big
error de compilación. Por otro lado, obtengo la precisión esperada de 16 dígitos decimales para fp
los 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 l3fp
se 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
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 randint
a rand
, obtuve
El número se almacena con el exponente y cuatro grupos de cuatro dígitos para el significado. Las dos funciones internas \s__fp
y \__fp_chk:w
se utilizan para manipular (ampliablemente) el número. Un terminador ;
finaliza la representación interna.
Respuesta2
El número 2147483648
es 2^31
exactamente y \int_...
las variables son en realidad registros de conteo TeX, que tienen un rango de números "limitado", al igual que LaTeX
los contadores habituales, que son - 2^{31} to 2^{31} - 1
exactamente 2^32
números.
Si observa el archivo .log de un archivo con expl3 cargado, verá que las \int...
macros \countXYZ
en realidad son definiciones.
Intentar almacenar 2147483648
generará 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.