\newcount가 보유할 수 있는 최대 수를 얻는 방법은 무엇입니까?

\newcount가 보유할 수 있는 최대 수를 얻는 방법은 무엇입니까?

보유할 수 있는 최대 양의 정수를 포함하는 명령이 있습니까 \newcount?

답변1

TeX 레지스터에 허용되는 최대 정수는 \count2147483647입니다.

\number\numexpr2*\maxdimen+1\relaxe-TeX 확장을 사용하는 경우 로 액세스할 수 있습니다 .

답변2

조금 조사하는 동안 나는 (적어도 나에게는) 몇 가지 흥미로운 점과 카운트 레지스터의 최대값을 얻는 방법을 발견했습니다. (이 답변은 Knuth TeX를 사용하므로 아무 \numexpr것도 사용하지 않지만 물론 e-TeX에서도 작동합니다.)

TeX은 내부적으로 부호 있는 32비트 정수를 사용합니다. 부호 있는 32비트 정수에서 숫자의 범위는 및 이며 , 1씩 증가하는 순서는 다음과 같습니다.-231231-1

%                      sign change V
0, 1, ..., 2147483646, 2147483647, -2147483648, -2147483647, ..., -1

그러나 TeX에서는 다음보다 큰 숫자를 입력할 수 없습니다 .231-1

여기에 이미지 설명을 입력하세요

그러나 a에 저장 하면231-1\counter\advance\counter by 1-231 . Frank가 아래 의견에서 말했듯이 Karl은그의 대답\advance, Knuth는 효율성상의 이유로 TeX에 산술 오버플로 검사를 추가하지 않았습니다 . 그러나 이로 인해 몇 가지 사악한 트릭을 수행할 수 있게 되었습니다. :-)

이를 이용하여 최대 정수 값이 무엇인지 알아내는 방법을 무차별 공격할 수 있습니다. 표시가 바뀔 때까지 카운터에 하나를 추가할 수 있습니다. 부호가 변경되면 이전 값은 최대 정수였습니다. 작업 속도를 높이려면 더 큰 단계로 시작하고 어떤 값이 최대값인지 알 때까지 단계 크기를 줄일 수 있습니다. 아래 코드는 이를 수행합니다(아주 빠르게).

\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

먼저 두 개의 카운터를 0으로 초기화한 다음 카운터를 \maxcount특정 값만큼 단계적으로 조정하는 것으로 시작합니다. 계단식 값이 \maxcount음수(즉,) 보다 작아지면 \tmp부호 변경 경계를 통과하고 되돌아가야 합니다. 그렇지 않으면 다시 시도하세요. 큰 값에 대해 이 작업을 시작하여 한계에 더 빨리 도달한 다음 정확한 일치 항목을 찾는 단계를 줄일 수 있습니다.

위 코드의 터미널 출력은 다음과 같습니다.

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.

답변3

프랭크 말이 맞아요. tex.web의 섹션 104에는 다음 텍스트가 있습니다.

\TeX\의 현재 구현은 차원을 더하거나 뺄 때 오버플로를 확인하지 않습니다. 이것은 다음과 같은 방법으로 수행할 수 있습니다. 그러나 오버플로가 발생할 가능성이 너무 낮아서 그러한 테스트는 가치가 없어 보입니다.

동일한 진술이 Digital Typography, The Final Errors of TeX 기사의 660페이지에 있습니다.

나는 Knuth가 다른 곳에서도 그 점을 반복했다고 생각합니다. 아마도 조정 보고서 중 하나에서 문제는 TeX를 잘못된 산술로 충돌시키는 것에 관한 것이었지만 지금은 찾을 수 없습니다.

관련 정보