
보유할 수 있는 최대 양의 정수를 포함하는 명령이 있습니까 \newcount
?
답변1
TeX 레지스터에 허용되는 최대 정수는 \count
2147483647입니다.
\number\numexpr2*\maxdimen+1\relax
e-TeX 확장을 사용하는 경우 로 액세스할 수 있습니다 .
답변2
조금 조사하는 동안 나는 (적어도 나에게는) 몇 가지 흥미로운 점과 카운트 레지스터의 최대값을 얻는 방법을 발견했습니다. (이 답변은 Knuth TeX를 사용하므로 아무 \numexpr
것도 사용하지 않지만 물론 e-TeX에서도 작동합니다.)
TeX은 내부적으로 부호 있는 32비트 정수를 사용합니다. 부호 있는 32비트 정수에서 숫자의 범위는 및 이며 , 1씩 증가하는 순서는 다음과 같습니다.-231
231-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를 잘못된 산술로 충돌시키는 것에 관한 것이었지만 지금은 찾을 수 없습니다.