Ganzzahl- und Gleitkommagenauigkeit in LaTeX3

Ganzzahl- und Gleitkommagenauigkeit in LaTeX3

Das L3fp-Paket schlägt einen Parameterbereich randintvon vor +- 10^16 - 1; ich bin jedoch anscheinend auf beschränkt +-2^31 - 1; jeder Wert darüber führt zu einem Number too bigKompilierungsfehler. Andererseits erhalte ich die erwartete volle 16-Dezimalstellen-Genauigkeit für fpWerte. Warum?

\documentclass{article}
% RN. 15 April 2017
% BRIEF DESCRIPTION:
%=======================
\usepackage[check-declarations]{expl3}
\usepackage{xparse}
%-----------------------
\ExplSyntaxOn
\int_new:N \l_rn_someInteger_int
\fp_new:N \l_rn_someFp_fp
\NewDocumentCommand\mySetInteger{m}
  {
    \int_set:Nn \l_rn_someInteger_int {#1}
    some~integer:~\int_use:N \l_rn_someInteger_int\\
    \int_set:Nn \l_rn_someInteger_int {\fp_eval:n {randint(#1)}}
    some~random~integer:~\int_use:N \l_rn_someInteger_int\\
    \fp_set:Nn \l_rn_someFp_fp {\fp_eval:n {rand()}}
    some~random~real:~\fp_use:N \l_rn_someFp_fp\\
    -------------------------------------------\\
  }
\ExplSyntaxOff
%-----------------------
\begin{document}
    \mySetInteger{1234}
    \mySetInteger{2147483647}

%   \mySetInteger{2147483648}
%   \mySetInteger{9999999999999999}
\end{document}

Antwort1

Wir können uns ansehen, wie l3fpein Gleitkommaausdruck gespeichert wird:

\documentclass{article}
\usepackage{xfp}

\begin{document}

\ttfamily

\ExplSyntaxOn % we want to do tests

\fp_set:Nn \l_tmpa_fp { randint(10^15,10^15+10^12) }

\fp_eval:n { \l_tmpa_fp }

\par

\cs_meaning:N \l_tmpa_fp

\ExplSyntaxOff

\end{document}

In einem Experiment bekomme ich

Bildbeschreibung hier eingeben

das zeigt, dass die zufällige Ganzzahl nicht als Ganzzahl im ursprünglichen Sinne von TeX gespeichert wird, da der Bereich auf den Bereich –2 31 bis 2 31 –1 beschränkt ist.

Man kann einer Integer-Variablen einfach keinen Wert außerhalb des oben genannten Bereichs zuweisen.

Beim Arbeiten mit „Gleitkommazahlen“ gelten die üblichen Einschränkungen der Gleitkommaarithmetik.

Ebenso bekam ich nach dem Wechsel randintzu ,rand

Bildbeschreibung hier eingeben

Die Zahl wird mit dem Exponenten und vier Vierergruppen für den Mantisse gespeichert. Die beiden internen Funktionen \s__fpund \__fp_chk:wdienen zur Manipulation (Erweiterbarkeit) der Zahl. Ein Terminator ;beendet die interne Darstellung.

Antwort2

Die Zahl 2147483648ist 2^31genau und \int_...die Variablen sind eigentlich TeX-Zählregister, die einen „begrenzten“ Zahlenbereich haben, ebenso wie normale LaTeXZähler, also - 2^{31} to 2^{31} - 1genau 2^32Zahlen.

Wenn Sie in die LOG-Datei einer Datei mit geladenem expl3 schauen, werden Sie sehen, dass es sich bei den \int...Makros \countXYZtatsächlich um Definitionen handelt.

Der Versuch, etwas zu speichern, würde ebenfalls 2147483648einen Überlauf erzeugen .\setcounter{foo}{2147483648}

Gleitkommazahlen werden als Dimensionsregister anders gespeichert und erlauben größere Zahlen, die Genauigkeit ist jedoch nicht besser.

Bitte schauen Sie sich anWas ist die maximale Ganzzahl, die in einem LaTeX-Zähler gespeichert werden kann?sowie.

verwandte Informationen