
\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
しかし、に保存してを取得すると、になります。下のコメントでフランクが言っているように、そして のカールは231-1
\counter
\advance\counter by 1
-231
彼の答え\advance
Knuth は効率上の理由からTeX に算術オーバーフロー チェックを追加しませんでした。しかし、これによって巧妙なトリックを実行できるようになります :-)
これを利用して、最大整数の値が何であるかを総当たり方式で調べることができます。符号が変わるまでカウンターに 1 を追加します。符号が変わると、前の値が最大整数になります。処理を高速化するには、ステップを大きくして開始し、最大値がわかるまでステップ サイズを小さくします。以下のコードはこれを実行します (かなり高速です)。
\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
\maxcount
まず2つのカウンターをゼロで初期化し、次にカウンターをある値だけステップアップします。ステップアップした値が\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
Frank は正しいです。tex.web のセクション 104 に次のテキストがあります:
現在の \TeX\ の実装では、次元を追加または削除するときにオーバーフローをチェックしません。これは ... によって実行できますが、オーバーフローの可能性は非常に低いため、このようなテストは価値がないと思われます。
同じ記述は、「Digital Typography, The Final Errors of TeX」の記事の 660 ページにも記載されています。
Knuth は他の場所でも、おそらくチューンアップ レポートの 1 つで、その点を繰り返し述べていたと思います。そのレポートでは、不正な演算によって TeX がクラッシュするという問題が取り上げられていましたが、今はそのレポートが見つかりません...