
Existe um comando que contém o maior número inteiro positivo que \newcount
pode conter?
Responder1
O número inteiro máximo permitido em um \count
registrador TeX é 2147483647.
Você pode acessá-lo como \number\numexpr2*\maxdimen+1\relax
, se usar extensões e-TeX.
Responder2
Ao investigar um pouco descobri algumas coisas interessantes (pelo menos para mim) e uma forma de obter o valor máximo de um registrador de contagem. (Esta resposta usará Knuth TeX, então não \numexpr
ou nada, mas é claro que também funciona com e-TeX.)
TeX usa inteiros assinados de 32 bits internamente. Em um inteiro assinado de 32 bits, os números variam entre e e sua ordem em incrementos de um é:-231
231-1
% sign change V
0, 1, ..., 2147483646, 2147483647, -2147483648, -2147483647, ..., -1
No entanto, o TeX não permite inserir um número maior que :231-1
No entanto , se você armazenar em um arquivo . Como Frank diz no comentário abaixo e Karl em231-1
\counter
\advance\counter by 1
-231
a resposta dele, Knuth não adicionou verificação de estouro aritmético ao TeX \advance
por motivos de eficiência. No entanto, isso abre você para fazer alguns truques tortuosos :-)
Você pode explorar isso para descobrir qual é o valor do número inteiro máximo. Você pode adicionar um a um contador até que seu sinal mude. Quando o sinal muda, o valor anterior era o número inteiro máximo. Para tornar as coisas mais rápidas, você pode começar com passos maiores e reduzir o tamanho do passo até descobrir qual valor é o máximo. O código abaixo faz isso (muito rapidamente):
\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
Primeiro inicializamos dois contadores como zero, depois começamos aumentando o \maxcount
contador em algum valor. Se o valor escalonado for \maxcount
negativo (ou seja,torna-se menor que \tmp
), então ultrapassamos o limite de mudança de sinal e precisamos voltar atrás. Caso contrário, tente novamente. Podemos começar a fazer isso para valores grandes, para que chegue ao limite mais rapidamente, e depois reduzir o passo para descobrir a correspondência exata.
A saída do terminal para o código acima é:
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.
Responder3
Frank está correto. Na seção 104 do tex.web está este texto:
A implementação atual do \TeX\ não verifica estouro quando dimensões são adicionadas ou subtraídas. Isto poderia ser feito até... mas a possibilidade de transbordamento é tão remota que tais testes não parecem valer a pena.
A mesma afirmação está na página 660 do artigo Tipografia Digital, Os Erros Finais do TeX.
Acho que Knuth também reiterou esse ponto em outro lugar, talvez em um dos relatórios de ajuste, onde a questão era sobre quebrar o TeX com aritmética tortuosa, mas não consigo encontrar esse agora...