
¿Existe algún comando que contenga el mayor entero positivo que \newcount
pueda contener?
Respuesta1
El número entero máximo permitido en un \count
registro TeX es 2147483647.
Puede acceder a él como \number\numexpr2*\maxdimen+1\relax
, si usa extensiones e-TeX.
Respuesta2
Mientras investigaba un poco descubrí algunas cosas interesantes (al menos para mí) y una forma de obtener el valor máximo de un registro de conteo. (Esta respuesta usará Knuth TeX, así que no \numexpr
ni nada, pero, por supuesto, también funciona con e-TeX).
TeX utiliza enteros de 32 bits con signo internamente. En un entero de 32 bits con signo, los números van desde y y su orden en incrementos de uno es:-231
231-1
% sign change V
0, 1, ..., 2147483646, 2147483647, -2147483648, -2147483647, ..., -1
Sin embargo, TeX no le permite ingresar un número mayor que :231-1
Sin embargo, si lo almacena en un y lo obtiene . Como dice Frank en el comentario a continuación y Karl en231-1
\counter
\advance\counter by 1
-231
su respuesta, Knuth no agregó verificación de desbordamiento aritmético a TeX \advance
por razones de eficiencia. Sin embargo, esto te abre a hacer algunos trucos tortuosos :-)
Puedes explotar eso para descubrir por fuerza bruta cuál es el valor del entero máximo. Puedes agregar uno a un contador hasta que cambie su signo. Cuando cambia el signo, el valor anterior era el entero máximo. Para acelerar las cosas, puede comenzar con pasos más grandes y reducir el tamaño del paso hasta descubrir cuál es el valor máximo. El siguiente código hace eso (bastante rápido):
\newcount\maxcount
\newcount\tmp
\def\gobble#1{}
\def\addloop#1{%
\advance\maxcount by #1 % Add to the counter
\ifnum\maxcount<\tmp % If it is negative
\advance\maxcount by -#1 % undo
\expandafter\gobble % and return
\else
\tmp\maxcount % otherwise save the value
\expandafter\addloop % and try again
\fi{#1}}
\def\getmaxcount{%
\maxcount=0
\tmp=0
\addloop{1000000}% Faster
\addloop{1000}% Slower
\addloop{1}% Slowest
}
\getmaxcount
\showthe\maxcount
\bye
Primero inicializamos dos contadores como cero, luego comenzamos incrementando el \maxcount
contador en algún valor. Si el valor escalonado se vuelve \maxcount
negativo (es decir,se vuelve más pequeño que \tmp
), luego pasamos el límite de cambio de signo y necesitamos retroceder. De lo contrario, inténtalo de nuevo. Podemos empezar a hacer esto para valores grandes, para que llegue al límite más rápido, y luego reducir el paso para encontrar la coincidencia exacta.
La salida del terminal para el código anterior es:
C:\Users\Phelype\tex.sx>tex test.tex
This is TeX, Version 3.14159265 (TeX Live 2019/W32TeX) (preloaded format=tex)
(./test.tex
> 2147483647.
l.25 \showthe\maxcount
?
)
No pages of output.
Transcript written on test.log.
Respuesta3
Frank tiene razón. En la sección 104 de tex.web está este texto:
La implementación actual de \TeX\ no comprueba el desbordamiento cuando se suman o restan dimensiones. Esto podría hacerse mediante... pero la posibilidad de desbordamiento es tan remota que tales pruebas no parecen valer la pena.
La misma declaración se encuentra en la página 660 del artículo Digital Typography, The Final Errors of TeX.
Creo que Knuth también ha reiterado ese punto en otros lugares, tal vez en uno de los informes de puesta a punto, donde la pregunta era sobre bloquear TeX con aritmética tortuosa, pero no puedo encontrarlo ahora...