Wenn ich etwas berechne, werden die Zwischenergebnisse manchmal zu groß für das pgf
-System. Man kann die Bibliothek fpu
verwenden. Ich habe darüber im Handbuch TikZ & PGF
(siehe Seite 627), hier und hier , aber ich erhalte immer noch den folgenden Fehler:
Paragraph ended before `\pgfflt@readlowlevelfloat` was complete.
Was ist falsch?
Hier ist mein Code:
\documentclass{scrartcl} \usepackage{tikz} \usetikzlibrary{fpu} \begin{document} %data values: \def\RTable{{100,100.391,100.781,101.172,101.562,101.953,102.343,102.733,103.123,103.513,103.903,104.292,104.682,105.071,105.46,105.849,106.238,106.627,107.016,107.405,107.794,108.182,108.57,108.959,109.347,109.735,110.123,110.51,110.898,111.286,111.673,112.06,112.447,112.835,113.221,113.608,113.995,114.382,114.768,115.155,115.541,115.927,116.313,116.699,117.085,117.47,117.856,118.241,118.627,119.012,119.397,119.782,120.167,120.552,120.936,121.321,121.705,122.09,122.474,122.858,123.242,123.626,124.009,124.393,124.777,125.16,125.543,125.926,126.309,126.692,127.075,127.458,127.84,128.223,128.605,128.987,129.37,129.752,130.133,130.515,130.897}} %prints the result to the console: \pgfkeys{/pgf/fpu} \foreach \i in {0, ..., 80} { \pgfmathparse{abs(\RTable[\i] - 100 - 3.0897 / 8 * \i)}\i, \pgfmathresult\\ } \pgfkeys{/pgf/fpu=false} \end{document}
Update :
Ich verwende ein Makro von hier (dank Schrödingers Katze ). Siehe meine MWE:
\documentclass{scrartcl} \usepackage{tikz} \usetikzlibrary{fpu} \newcommand\pgfmathparseFPU[1]{ \begingroup \pgfkeys{ /pgf/fpu, /pgf/fpu/output format = fixed } \pgfmathparse{#1} \pgfmathsmuggle \pgfmathresult \endgroup} \begin{document} %data values: \def\UABmValues{{14.9, 15.8, 17.7, 18.3, 19, 20, 21.1, 22.2, 24.3, 26.9, 30.1}} %prints the result to the console: \foreach[count = \i from 0] \k in {30, 35, ..., 80} { \pgfmathparseFPU{-25500 / (\UABmValues[\i] / 1000 - 255 / 52) - 5200 - 3.0897 / 8 * \k}\i, \pgfmathresult\\ } \end{document}
und erhalte immer noch einen
Paragraph ended before `\pgfflt@readlowlevelfloat` was complete.
Fehler. Was mache ich falsch?
Vielen Dank für Ihre Hilfe und Ihren Einsatz im Voraus!
Kommentare
- I ‚ Ich bin nicht sicher, ob dies behoben werden kann, da pgfmath ständig zwischen Text, Dimen-Registern und FPU-Registern hin und her konvertiert (weshalb ich es als tanzenden Bären betrachte).
- Hallo allerseits! Hat keiner der Fachleute einen Lösungsvorschlag?
- Beachten Sie, dass
\pgfkeys{pgf/fpu=false}
nicht das tut, was es verspricht, es sei denn, es wurde kürzlich behoben. - Ich denke, Sie sollten eine neue Frage dazu stellen, da Sie bereits eine nette Antwort erhalten haben.
\foreach[count = \i from 0] \k in {30, 35, ..., 80} { \pgfmathsetmacro{\myval}{\UABmValues[\i]} \pgfmathparseFPU{-25500/(\myval/1000-255/52)-5200-3.0897/8*\k}\i, \pgfmathresult\\ }
funktioniert. Derzeit unterstütztfpu
einige Dinge nicht, einschließlich der Manipulation von Ganzzahlen und dieser Art der Listenextraktion. Sie müssen den Eintrag also ohnefpu
extrahieren. - @ Su-47 Ich denke, Alain Matthes Antwort ist gut. Bitte beachten Sie, dass keines der Systeme wirklich mit einem Computeralgebrasystem konkurrieren kann. Eine radikal neue Version von TeX würde erfordern, um die internen Einschränkungen wirklich aufzuheben, aber AFAIK, es gibt keinen Plan, jemals eine neue TeX einzurichten. Bitte beachten Sie auch, dass es meiner Meinung nach besser ist, mit expl3 zu warten, bis es sich in einem Zustand befindet, in dem Sie sicher sein können, dass das, was Sie geschrieben haben, in einem Jahr noch funktioniert. Da Sie anscheinend MatLab verwenden, können Sie die Daten jederzeit mit diesem Tool erstellen und dann mit pgfplots oder Datenavisualisierung zeichnen.
Antwort
Klingt nach einem Job für die LaTeX3-FPU:
\documentclass{article} \usepackage{expl3} \ExplSyntaxOn \cs_new_eq:NN \fpeval \fp_eval:n \cs_new_eq:NN \clistitem \clist_item:Nn \cs_new_eq:NN \foreachint \int_step_inline:nnnn \ExplSyntaxOff \begin{document} %data values: \def\RTable{100,100.391,100.781,101.172,101.562,101.953,102.343,102.733,103.123,103.513,103.903,104.292,104.682,105.071,105.46,105.849,106.238,106.627,107.016,107.405,107.794,108.182,108.57,108.959,109.347,109.735,110.123,110.51,110.898,111.286,111.673,112.06,112.447,112.835,113.221,113.608,113.995,114.382,114.768,115.155,115.541,115.927,116.313,116.699,117.085,117.47,117.856,118.241,118.627,119.012,119.397,119.782,120.167,120.552,120.936,121.321,121.705,122.09,122.474,122.858,123.242,123.626,124.009,124.393,124.777,125.16,125.543,125.926,126.309,126.692,127.075,127.458,127.84,128.223,128.605,128.987,129.37,129.752,130.133,130.515,130.897} %prints the result to the console: \foreachint{1}{1}{81}{% #1, \fpeval{abs(\clistitem\RTable{#1} - 100 - 3.0897 / 8 * (#1 - 1))}\\ } \end{document}
(Die Konvention in expl3
soll von 1 indizieren, da dies mit dem häufigsten Anwendungsfall übereinstimmt: Satz. Ich habe daher die Liste von eins indiziert, aber für die Gleichung selbst auf den Index von Null korrigiert.)
Kommentare
- Hallo @Joseph Wright! Vielen Dank für Ihre Antwort, die ich getestet habe. 1. Natürlich funktioniert es, aber die Indexvariable sollte mit Null beginnen (z Mein besonderer Zweck). 2. Die Ergebnisse Ihrer Antwort sind unterschiedlich. Die korrekten Ergebnisse sollten wie eine nach unten gerichtete Parabel aussehen, siehe hier . Die Ergebnisse Ihrer Antwort sehen aus wie eine nach oben geöffnete Parabel. Vielleicht mache ich etwas falsch. 3. Wie auch immer, ich kann ‚ Ihre nicht verwenden Antwort in meiner Frage (siehe den Link oben). Was sagen Sie?
- @ Su-47 Ich ‚ weiß nicht, was Sie mit ‚ dem Link meinen über ‚
- Der Link in Punkt 2 wahrscheinlich ( tex.stackexchange.com/questions/348739/ … ).
- Hallo @Joseph Wright und @Torbj ø rn T.! Entschuldigung für die lange Abwesenheit. Vielen Dank für Ihre Kommentare. Torbj ø rn T. ist richtig Ich meinte diesen Link . Jetzt ist das Ergebnis richtig. Aber wie ich in meinem letzten Kommentar sagte, kann ich ‚ die obige Antwort nicht verwenden, um meine andere Frage zu lösen (siehe den obigen Link). Wenn ich das derzeit richtig verstehe, gibt es keine Möglichkeit, Arrays und
fpu
zusammen inTikZ
zu verwenden? Gibt es eine andere Lösung, möglicherweise eine andere Datenstruktur als Arrays?