Anschlussfrage zu http://texwelt.de/wissen/fragen/21219/folge-fur-groere-argumente-ausgeben Mir ist aufgefallen, dass ich
Gibt es da eine Möglichkeit? Öffne in Overleaf
%\documentclass[]{article} \documentclass[border=5mm, varwidth]{standalone} \usepackage[german]{babel} \usepackage{tikz} \usetikzlibrary{math} \usetikzlibrary{fpu} \pgfkeys{/pgf/fpu=true} \begin{document} \tikzmath{ % Tut function mersenne(\N) {return int(2^\N-1);}; % Tut nicht %function mersenne(\N) {return int(gcd((2^\N-1),17);}; } \texttt{Sorry, the operation 'gcd' has not yet been implement ed in the floating point unit} \foreach \n in {1,...,20}{ \pgfmathparse{mersenne(\n)} \pgfmathprintnumber\pgfmathresult, } \end{document} gefragt 09 Jan '18, 14:42 cis |
Das Problem lässt sich leicht beheben indem man tut was die Meldung sagt
Da ich leider keine Ahnung habe, wie die internen Routinen der FPU das anstellen, dass da nicht immer
Öffne in Overleaf
\documentclass{article} \usepackage{luacode} \begin{luacode*} -- https://de.wikipedia.org/wiki/Euklidischer_Algorithmus function gcd(a,b) return (b ~= 0) and gcd(b,a%b) or a end \end{luacode*} \usepackage{tikz} \usetikzlibrary{math} \usetikzlibrary{fpu} \makeatletter \let\pgfmath@basic@gcd@=\pgfmathgcd@ \def\pgfmathfloatgcd#1#2{% \pgfmathfloattoint{#1}\let\pgfmath@tempa\pgfmathresult \pgfmathfloattoint{#2}\let\pgfmath@tempb\pgfmathresult %%% PUT PROPER TEX IMPLEMENTATION BELOW \edef\pgfmathresult{\directlua{tex.sprint(gcd(\pgfmath@tempa,\pgfmath@tempb))}}% %%% PUT PROPER TEX IMPLEMENTATION ABOVE \pgfmathfloatparsenumber{\pgfmathresult}% } \let\pgfmathfloatgcd@=\pgfmathfloatgcd \g@addto@macro\pgfmathfloat@parser@install@functions{% \pgfmathfloat@install\pgfmathgcd@=\pgfmathfloatgcd@ } \makeatother \pgfkeys{/pgf/fpu=true} \begin{document} \tikzmath{ function mersenne(\N) {return int(gcd((2^\N-1),17);}; } \foreach \n in {1,...,15}{ \pgfmathparse{mersenne(\n)} \pgfmathprintnumber\pgfmathresult, } \end{document} Das oben gezeigte ist übrigens bereits in TikZ verfügbar mit der Öffne in Overleaf
\documentclass{article} \usepackage{tikz} \usepgflibrary{luamath} \pgfkeys{/pgf/luamath=parser} \usetikzlibrary{math} \begin{document} \tikzmath{ function mersenne(\N) {return int(gcd((2^\N-1),17));}; } \foreach \n in {1,...,15}{ \pgfmathparse{mersenne(\n)} \pgfmathprintnumber\pgfmathresult, } \end{document} beantwortet 10 Jan '18, 04:35 Henri |
Flotingpointnumbers, also Gleitkommazahlen im deutschen, sind die (versuchte) Implementierungen von reellen Zahlen. Und bei reellen Zahlen macht ein größter gemeinsamer Teiler (ggT im englischen gcd), im Gegesatz zu Integer als versuchte Implementierung von ganzen Zahlen, einfach keinen Sinn. Darum hat das auch niemand implementiert, denke ich mal. Auch bekommt man mit Gleitkommazahlen keine bessere Genauigkeit hin als mit einer guten Ganzzahlarithmetik. - Ich denke also, der Ansatz ist schon falsch, die Mittel sind falsch und externe Progamme wie Mathematica oder ähnliches wären hier sinnvoller. beantwortet 16 Jan '18, 11:03 NMarkgraf Klar, da hast Du natürlich recht.
(16 Jan '18, 20:39)
cis
|