Das L3fp-Paket schlägt einen Parameterbereich randint
von vor +- 10^16 - 1
; ich bin jedoch anscheinend auf beschränkt +-2^31 - 1
; jeder Wert darüber führt zu einem Number too big
Kompilierungsfehler. Andererseits erhalte ich die erwartete volle 16-Dezimalstellen-Genauigkeit für fp
Werte. 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 l3fp
ein 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
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 randint
zu ,rand
Die Zahl wird mit dem Exponenten und vier Vierergruppen für den Mantisse gespeichert. Die beiden internen Funktionen \s__fp
und \__fp_chk:w
dienen zur Manipulation (Erweiterbarkeit) der Zahl. Ein Terminator ;
beendet die interne Darstellung.
Antwort2
Die Zahl 2147483648
ist 2^31
genau und \int_...
die Variablen sind eigentlich TeX-Zählregister, die einen „begrenzten“ Zahlenbereich haben, ebenso wie normale LaTeX
Zähler, also - 2^{31} to 2^{31} - 1
genau 2^32
Zahlen.
Wenn Sie in die LOG-Datei einer Datei mit geladenem expl3 schauen, werden Sie sehen, dass es sich bei den \int...
Makros \countXYZ
tatsächlich um Definitionen handelt.
Der Versuch, etwas zu speichern, würde ebenfalls 2147483648
einen Ü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.