Division durch Null

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Division durch Null

von cgnieder » Fr 4. Okt 2013, 17:02

Omega hat geschrieben:Ich denke dabei an umfangreichere Varianten vom Makro \doit in der Praxis.

Findest du nicht, dass dein erster Lösungsvorschlag in der Praxis zweckdienlicher ist?
Sehr schwer zu sagen. Das hängst sehr davon ab, was denn genau am Schluß gewünscht ist, also was das tatsächliche \doit machen soll, wie die erwartete User-Eingabe aussieht usw. usf. Mein ursprünglicher Vorschlag entspricht weder der LaTeX-Syntax noch der pgf-Syntax sondern nutzt TeX-Primitive, ist insofern auch nur begrenzt einsetzbar... Ein Nachteil ist außerdem, dass \if... \fi Konstrukte im Zweifelsfall nur umständlich schachtelbar sind...

Alles in allem: hängt davon ab...

Grüße

von Omega » Fr 4. Okt 2013, 16:31

Meiner Meinung nach entsteht eine gewisse Redundanz durch diese Methode,
was nicht gerade die Übersicht fördert.
Ich denke dabei an umfangreichere Varianten vom Makro \doit in der Praxis.

Findest du nicht, dass dein erster Lösungsvorschlag in der Praxis zweckdienlicher ist?


Gruß

von cgnieder » Fr 4. Okt 2013, 16:17

Omega hat geschrieben:Was ist aber für den Fall, wenn ich das Ergebnis in ein \pgfmathsetmacro speichern möchte. Dies klappt bei mir nicht, da scheinbar \pgfmathsetmacro keine durch \newcommand erstellten Makros verarbeiten kann.
Das ist nicht das Problem, sondern, dass \pgfmathresult nach Expansion von \doit im Zweifelsfall keine Zahl enthält! Du musst es expandieren lassen, damit danach in \pgfmathresult tatsächlich das gewünschte Ergebnis enthalten ist:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\newcommand\division{\pgfmathparse{1/\divisor}\pgfmathresult}

\newcommand\doit{%
   \draw (0,0) node[right] {\pgfmathparse{\divisor > 0.0001 ?
       "\noexpand\division" : 7353}\pgfmathresult};
   \pgfmathparse{\divisor > 0.0001 ? "\noexpand\division" : 7353}
   % \show\pgfmathresult % im log anzeigen, wie \pgfmathresult definiert ist
   \pgfmathresult
   % \show\pgfmathresult % im log anzeigen, wie \pgfmathresult definiert ist
   \pgfmathsetmacro\nr{\pgfmathresult}
   \draw (3,0) node {\nr};
}  

\begin{document}
   \begin{tikzpicture}\def\divisor{0.05}\doit\end{tikzpicture}

   \begin{tikzpicture}\def\divisor{3}\doit\end{tikzpicture}

   \begin{tikzpicture}\def\divisor{0.00009}\doit\end{tikzpicture}
\end{document}
Grüße

von Omega » Fr 4. Okt 2013, 16:06

Das ist auch eine Lösung. Danke.

Was ist aber für den Fall, wenn ich das Ergebnis in ein \pgfmathsetmacro speichern möchte. Dies klappt bei mir nicht, da scheinbar \pgfmathsetmacro keine durch \newcommand erstellten Makros verarbeiten kann.

Hier ein Beispiel:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\newcommand\division{\pgfmathparse{1/\divisor}\pgfmathresult}

\newcommand\doit{%
	\draw (0,0) node[right] {\pgfmathparse{\divisor > 0.0001 ? "\noexpand\division" : 7353}\pgfmathresult};
	\pgfmathsetmacro\nr{\divisor > 0.0001 ? 1+"\noexpand\division" : 7353}
	\draw (3,0) node {\nr};
}  

\begin{document}
   \begin{tikzpicture}\def\divisor{0.05}\doit\end{tikzpicture}

   \begin{tikzpicture}\def\divisor{3}\doit\end{tikzpicture}

   \begin{tikzpicture}\def\divisor{0.00009}\doit\end{tikzpicture}
\end{document}
Gruß

von esdd » Fr 4. Okt 2013, 01:18

In der Doku habe ich folgendes gefunden:
"x" (group operators)
These operators are used to quote x . However, as every expression is expanded with \edef before
it is parsed, macros (e.g., font commands like \tt or \Huge) may need to be "protected" from this
expansion (e.g., \noexpand\Huge). Ideally, you should avoid such macros anyway. Obviously, these
operators should be used with great care as further calculations are unlikely to be possible with the
result.
Das verstehe ich so, dass in der Tat erst alles expandiert wird, bevor die Bedingung ausgewertet wird. An der Stelle folgt dann auch noch ein Beispiel mit ifthenelse. Das lässt sich auf obiges Problem übertragen:
\documentclass{article} 
\usepackage[utf8]{inputenc} 
\usepackage{tikz}

\newcommand\division{\pgfmathparse{1/\divisor}\pgfmathresult}

\newcommand\doit{%
  \draw (0,0) node {\pgfmathparse{\divisor > 0.0001 ? "\noexpand\division" : 7353}\pgfmathresult};%
}  

\begin{document} 
   \begin{tikzpicture}\def\divisor{0.05}\doit\end{tikzpicture}

   \begin{tikzpicture}\def\divisor{3}\doit\end{tikzpicture}

   \begin{tikzpicture}\def\divisor{0.00009}\doit\end{tikzpicture}
\end{document}
Darüber hinaus ist die Rechengenauigkeit von pgfmath begrenzt.

Gruß
Elke

von cgnieder » Do 3. Okt 2013, 22:58

Stimmt.

Ich sehe meine Antwort auch eher als Notlösung. Man müsste eigentlich nach der Ursache fanden, wieso der pgf-Code schiefgeht. Meiner Meinung nach sollte der falsch-Zweig nicht evaluiert werden, wenn er nicht benötigt wird, offenbar wird er das aber doch...

Vielleicht hat ja ein/e pgf-Experte/in eine Erklärung.

Grüße

von Omega » Do 3. Okt 2013, 22:47

Super! Danke! :D

Sehe ich es richtig, dass es für \ifdim nur die Relationen ">","<" und "=" gibt und damit kein Ungleich z.b. "!=" ?

Viele Grüße

von cgnieder » Do 3. Okt 2013, 22:34

Dann ändere
\ifnum\divisor=0 
in
\ifdim\divisor pt=0pt 
Grüße

von Omega » Do 3. Okt 2013, 22:14

Hey Clemens,

vielen Dank für deine schnelle Antwort!

Was ist jedoch für den Fall, wenn der Divisor in deiner Antwort eine Fließkommazahl ist? Ich erhalte dann eine Fehlermeldung.
\ifnum akzeptiert ja schließlich nur ganze Zahlen.

Schöne Grüße

von cgnieder » Do 3. Okt 2013, 18:33

Vielleicht nicht so elegant, funktioniert aber:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\newcommand\doit{%
  \ifnum\divisor=0
    \pgfmathsetmacro\division{7353}
  \else
    \pgfmathsetmacro\division{1/\divisor}
  \fi
  \draw (0,0) node {\division};
}

\begin{document}
\begin{tikzpicture}
  \def\divisor{0}
  \doit
\end{tikzpicture}
\begin{tikzpicture}
  \def\divisor{3}
  \doit
\end{tikzpicture}

\end{document}
Grüße

Nach oben