Wie erhält man die maximale Zahl, die \newcount aufnehmen kann?

Wie erhält man die maximale Zahl, die \newcount aufnehmen kann?

Gibt es einen Befehl, der die größte positive Ganzzahl enthält, die \newcountgespeichert werden kann?

Antwort1

Die maximal zulässige Ganzzahl in einem TeX- \countRegister ist 2147483647.

Sie können darauf als zugreifen \number\numexpr2*\maxdimen+1\relax, wenn Sie e-TeX-Erweiterungen verwenden.

Antwort2

Bei meinen Nachforschungen habe ich einige interessante Dinge (zumindest für mich) herausgefunden und eine Möglichkeit, den Maximalwert eines Zählregisters zu ermitteln. (Diese Antwort verwendet Knuth TeX, also kein „ \numexproder so“, aber natürlich funktioniert es auch mit e-TeX.)

TeX verwendet intern vorzeichenbehaftete 32-Bit-Ganzzahlen. In einer vorzeichenbehafteten 32-Bit-Ganzzahl liegen die Zahlen zwischen und und ihre Reihenfolge in Einserschritten ist:-231231-1

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

Allerdings können Sie in TeX keine Zahlen eingeben, die größer sind als :231-1

Bildbeschreibung hier eingeben

Wenn Sie jedoch in einem speichern und Sie bekommen231-1\counter\advance\counter by 1-231 Wie Frank im Kommentar unten sagt und Karl inseine Antwort\advance, Knuth hat aus Effizienzgründen keine arithmetische Überlaufprüfung in TeX eingebaut . Dies eröffnet jedoch die Möglichkeit, einige hinterhältige Tricks anzuwenden :-)

Sie können dies ausnutzen, um mit roher Gewalt herauszufinden, was der Wert der maximalen Ganzzahl ist. Sie können einem Zähler eine Zahl hinzufügen, bis sich sein Vorzeichen ändert. Wenn sich das Vorzeichen ändert, war der vorherige Wert die maximale Ganzzahl. Um die Dinge zu beschleunigen, können Sie mit größeren Schritten beginnen und die Schrittweite verringern, bis Sie herausfinden, welcher Wert der Maximalwert ist. Der folgende Code macht das (ziemlich schnell):

\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

Zuerst initialisieren wir zwei Zähler auf Null, dann beginnen wir damit, den \maxcountZähler um einen Wert zu erhöhen. Wenn der erhöhte Wert \maxcountnegativ ist (dh,es wird kleiner als \tmp), dann haben wir die Vorzeichenwechselgrenze überschritten und müssen zurückgehen. Andernfalls versuchen wir es erneut. Wir können damit für große Werte beginnen, damit wir schneller an die Grenze gelangen, und dann den Schritt reduzieren, um die genaue Übereinstimmung herauszufinden.

Die Terminalausgabe für den obigen Code lautet:

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.

Antwort3

Frank hat recht. In Abschnitt 104 von tex.web steht dieser Text:

Die aktuelle Implementierung von \TeX\ prüft nicht auf Überlauf, wenn Dimensionen addiert oder subtrahiert werden. Dies könnte durch ... erfolgen, aber die Wahrscheinlichkeit eines Überlaufs ist so gering, dass derartige Tests nicht sinnvoll erscheinen.

Die gleiche Aussage findet sich auf Seite 660 des Artikels „Digital Typography, The Final Errors of TeX“.

Ich glaube, Knuth hat diesen Punkt auch anderswo wiederholt, vielleicht in einem der Tune-Up-Berichte, wo es um die Frage ging, ob TeX durch hinterhältige Arithmetik zum Absturz gebracht wird, aber den kann ich jetzt nicht finden ...

verwandte Informationen