Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 5
`\pgfmathfloatifapproxequalrel`-Beispiel

21 Jan '16, 10:15

saputello's gravatar image

saputello
11.1k174365

Mit \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \typeout{##1=#1?}% \ifdim##1pt=#1pt \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi } }, } findet man schnell heraus, dass beispielsweise 0.99999 mit 1.0. verglichen wird. Das ist dann in der Tat nicht gleich. Wird später allerdings auf vier Nachkommastellen gerundet, dann sind die Zahlen gleich. Also müsste man entweder bereits an dieser Stelle runden oder den Vergleich mit etwas *Unschärfe* versehen: \documentclass[paper=a5]{scrbook} \usepackage[left=1cm, right=1cm]{geometry} \usepackage{selinput} \SelectInputMappings{adieresis={ä}, germandbls={ß}} \usepackage[ngerman]{babel} \usepackage{pgfplotstable} \usepackage{amsmath, amssymb, amsfonts}% \binom \usepackage{colortbl}% \rowcolor, \cellcolor %\usepackage{multirow} \usepackage{hhline} \usepackage{diagbox} % \diagbox \usepackage{xcolor, booktabs} \usepackage{filecontents} \begin{document} \setlength\arrayrulewidth{0.905pt} % Um rules deutlich anzuzeigen \begin{filecontents}{n5.txt} 5 0 0.5905 0.3277 0.2373 0.1681 0.0778 0.0313 5 1 0.9185 0.7373 0.6328 0.5282 0.3370 0.1875 5 2 0.9914 0.9421 0.8965 0.8369 0.6826 0.5000 5 3 0.9995 0.9933 0.9844 0.9692 0.9130 0.8125 5 4 1.0000 0.9997 0.9990 0.9976 0.9898 0.9688 10 0 0.34868 0.10737 0.05631 0.02825 0.00605 0.00098 10 1 0.73610 0.37581 0.24403 0.14931 0.04636 0.01074 10 2 0.92981 0.67780 0.52559 0.38278 0.16729 0.05469 10 3 0.98720 0.87913 0.77588 0.64961 0.38228 0.17188 10 4 0.99837 0.96721 0.92187 0.84973 0.63310 0.37695 10 5 0.99985 0.99363 0.98027 0.95265 0.83376 0.62305 10 6 0.99999 0.99914 0.99649 0.98941 0.94524 0.82813 10 7 1.00000 0.99992 0.99958 0.99841 0.98771 0.94531 10 8 1.00000 1.00000 0.99997 0.99986 0.99832 0.98926 10 9 1.00000 1.00000 1.00000 0.99999 0.99990 0.99902 \end{filecontents} % =============================== % =============================== % Tabelle Summierte Binomial-Verteilung (SumBinVert) % =============================== % =============================== % Farben in Tabelle ===================== \colorlet{FarbeOben}{pink} \colorlet{FarbeUnten}{lightgray!60} % =============================== % Allgemeine Formatierungen für Tabelle (Schrift etc.) festlegen \pgfplotstableset{ foreach column append style/.code 2 args = { \pgfplotsforeachungrouped \col in {#1} { \pgfplotstableset{ /pgfplots/table/columns/\col/.append style = {#2} } } } } % =============================== % Erste Zeile ========================= \def\SumBinVertHinweisEinsen{% {\text{\tiny Nicht aufgeführte Werte sind (gerundet auf $4$ Dezimalstellen) gleich $1.0000$}} }% % -------------------------- \def\SumBinVertFormel{% $\begin{matrix} \displaystyle P(X\leq k) = \sum_{v=0}^k \binom{n}{v} p^v (1-p)^{n-v} \\ \SumBinVertHinweisEinsen \end{matrix}$ }% % -------------------------- \newcommand\ErsteZeile{% \hhline{~|-------|} & \multicolumn{7}{c|}{\cellcolor{FarbeOben} \SumBinVertFormel} \\ \hhline{~|-------|} \rowcolor{FarbeOben} }% % ============================== % Letzte Zeile ======================== \def\SumBinVertHinweisGrauzeile{% {\tiny$ \begin{array}{l} \text{Bei grau unterlegtem Eingang, d.h. $p \geq 0{,}5$: } %\\ \text{$P(X\leq k) = 1 -\langle\texttt{Ablesewert}\rangle$} \end{array} $} }% % -------------------------- \newcommand\LetzteZeile{% \hhline{~|-------|-|} \rowcolor{FarbeUnten} \multicolumn{1}{c}{\cellcolor{white}} & \cellcolor{white} & $0{,}9$ & $0{,}8$ & $0{,}75$ & $0{,}7$ & $0{,}6$ & $0{,}5$ & \diagbox{$p$}{$k$} \\ % Anderes Design \hhline{~~|>{\arrayrulecolor{FarbeUnten}}------>{\arrayrulecolor{black}}|-|} % \rowcolor{FarbeUnten} \multicolumn{1}{c}{\cellcolor{white}} & \multicolumn{1}{c|}{\cellcolor{white}} & \multicolumn{7}{l|}{\SumBinVertHinweisGrauzeile} %& \cellcolor{FarbeUnten} \\ \hhline{~~|-------|} }% % ============================== % 1en ausblenden ==================== \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \typeout{##1=#1?}% Zu Debugging-Zwecken \ifdim \dimexpr ##1pt-#1pt>-0.00005pt \ifdim \dimexpr ##1pt-#1pt<0.00005pt \typeout{Ja}% Zur Kontrolle \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi \fi } }, } % ============================== % Tabellen einlesen \pgfplotstableread{n5.txt}{\SumBinVertTab} %\pgfplotstableread{n10.txt}{\nX} % "n Römische Zahl" % Tabellen zusammenführen % ToDO %%\pgfplotstableread{dataA.dat}\dataA %%\pgfplotstableread{dataB.dat}\dataB % %\pgfplotstablecreatecol[copy column from table={\nX}{[index] 0}] {par1} {\SumBinVertTab} %\pgfplotstablecreatecol[copy column from table={\nX}{[index] 1}] {par2} {\SumBinVertTab} % %\pgfplotstabletypeset{\SumBinVertTab} \\ % -------------------------- % Tabelle setzen \pgfplotstabletypeset[ % Allgemeine Einstellungen fixed zerofill, fixed, precision=4, % Null-Kommas Beseitigen %ignore chars={\.0}, % -------------------------- % Erste Zeile definieren every head row/.style = { before row={\ErsteZeile}, after row=\hline }, % -------------------------- % Letzte Zeile definieren every last row/.style = { after row={\LetzteZeile}, }, % -------------------------- % Nullte nSpalte definieren create on use/nSpalte/.style = {%% precision=0, column type={|c}, create col/assign/.code = {% \edef\nMethode{\ifnum \thisrow{1} = 0 \thisrow{0} \fi} \pgfkeyslet{/pgfplots/table/create col/next content}\nMethode },% },%% columns/nSpalte/.style = {% column name ={\cellcolor{white}$n$}, precision=0, column type={c}, },% % -------------------------- % Erste k-Spalte definieren columns/1/.style = { column name={\diagbox{$k$}{$p$}}, precision=0, column type={|>{\cellcolor{FarbeOben}\scriptsize}c|}, }, % -------------------------- % Letzte kSymSpalte definieren create on use/kSymSpalte/.style={% create col/expr={\thisrow{0}-1-\thisrow{1}}, },% columns/kSymSpalte/.style={% column name={\multicolumn1c{\cellcolor{white}}}, %$n-1-k$ column type={|>{\cellcolor{FarbeUnten}\scriptsize}c|}, precision=0 },% % -------------------------- % Übrige Spalten benenen columns/2/.style = {column name={$0{,}1$},discard if equal={1.0}}, columns/3/.style = {column name={$0{,}2$},discard if equal={1.0}}, columns/4/.style = {column name={$0{,}25$},discard if equal={1.0}}, columns/5/.style = {column name={$0{,}3$},discard if equal={1.0}}, columns/6/.style = {column name={$0{,}4$},discard if equal={1.0}}, columns/7/.style = {column name={$0{,}5$},discard if equal={1.0}}, % -------------------------- % Einsen beseitigen %discard if equal={1.0}, % ToDo: Wie nur auf columns 1-6 anwenden? % -------------------------- % "Null Komma" in Tabelle beseitigen % ToDo.... % -------------------------- % Allgemeine Formatierungen festlegen foreach column append style={nSpalte,2,3,4,5,6,7}{column type/.add={>{\scriptsize}}{}}, % Angezeigte Spalten definieren columns={nSpalte,1,2,3,4,5,6,7,kSymSpalte} ]{\SumBinVertTab} \bigskip %\def\getcell#1#2{ %\pgfplotstablegetelem{#1}{#2}\of{\SumBinVertTab}\pgfplotsretval% %} % %$P(X \leq k) = B(n,p;k) = \getcell{0}{2}$ % %$P(X = k) = P(X \leq k) - P(X \leq k-1) = B(n,p;k) - B(n,p;k-1) = ???$ \end{document} ![alt text][1] Eine andere Möglichkeit wäre, an der Stelle eine Rundung mit Hilfe von `pgfmath` durchzuführen. Da mit `\pgfround` nicht auf eine bestimmte Anzahl an Nachkommastellen, sondern nur auf Integer gerundet werden kann, muss man den Wert entsprechend skalieren. Die Lösung könnte in obigem Fall beispielsweise so aussehen: \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \pgfmathparse{ifthenelse(round(##1*10000)==round(#1*10000),0,1)}% \ifcase \pgfmathresult \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi } }, } Dabei wird auch gleich `\pgfifthenelse` verwendet, um den Vergleich durchzuführen. Sind die Werte gleich, wird `\pgfmathresult` so 0, sonst 1. Das Ergebnis ist wie in der Abbildung oben. Die genannten Funktionen von `pgfmath` sind in der `pgf`-Anleitung dokumentiert (derzeit Kapitel 89). Last but not least kann man natürlich auch die Funktion zur Festlegung der Nachkommastellen verwenden, die auch `pgfplotstable` bei der Ausgabe der Zahlen verwendet, also `\pgfmathroundto`: \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \pgfkeys{/pgf/number format/precision=4}% \pgfmathroundto{##1}% \ifdim \pgfmathresult pt=#1pt \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi } }, } oder mit `ifthenelse`: \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \pgfkeys{/pgf/number format/precision=4}% \pgfmathroundto{##1}% \pgfmathparse{ifthenelse(\pgfmathresult==#1,0,1)}% \ifcase \pgfmathresult \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi } }, } Auch Außerdem liefert `pgf` auch gleich eine *unscharfen Vergleichsoperation* für Gleitkommazahlen, die genau den Vergleich durchführen kann, der letztlich auch bereits in meinem ersten Beispiel verwendet wird: \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \pgfkeys{/pgf/fpu/rel thresh=5e-5}% \pgfmathfloatifapproxequalrel{##1}{#1}{% \pgfkeyssetvalue{/pgfplots/table/@cell content}{} }{} } }, } All das liefert das gleiche Ergebnis wie oben bereits gezeigt. Dokumentiert ist sind `\pgfmathroundto` und `\pgfmathfloatifapproxequalrel` ebenfalls in der `pgf`-Anleitung, derzeit Kapitel 54. [1]: http://texwelt.de/wissen/upfiles/test28_2.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4
`\pgfroundto`-Beispiel ergänzt

21 Jan '16, 09:58

saputello's gravatar image

saputello
11.1k174365

Mit \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \typeout{##1=#1?}% \ifdim##1pt=#1pt \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi } }, } findet man schnell heraus, dass beispielsweise 0.99999 mit 1.0. verglichen wird. Das ist dann in der Tat nicht gleich. Wird später allerdings auf vier Nachkommastellen gerundet, dann sind die Zahlen gleich. Also müsste man entweder bereits an dieser Stelle runden oder den Vergleich mit etwas *Unschärfe* versehen: \documentclass[paper=a5]{scrbook} \usepackage[left=1cm, right=1cm]{geometry} \usepackage{selinput} \SelectInputMappings{adieresis={ä}, germandbls={ß}} \usepackage[ngerman]{babel} \usepackage{pgfplotstable} \usepackage{amsmath, amssymb, amsfonts}% \binom \usepackage{colortbl}% \rowcolor, \cellcolor %\usepackage{multirow} \usepackage{hhline} \usepackage{diagbox} % \diagbox \usepackage{xcolor, booktabs} \usepackage{filecontents} \begin{document} \setlength\arrayrulewidth{0.905pt} % Um rules deutlich anzuzeigen \begin{filecontents}{n5.txt} 5 0 0.5905 0.3277 0.2373 0.1681 0.0778 0.0313 5 1 0.9185 0.7373 0.6328 0.5282 0.3370 0.1875 5 2 0.9914 0.9421 0.8965 0.8369 0.6826 0.5000 5 3 0.9995 0.9933 0.9844 0.9692 0.9130 0.8125 5 4 1.0000 0.9997 0.9990 0.9976 0.9898 0.9688 10 0 0.34868 0.10737 0.05631 0.02825 0.00605 0.00098 10 1 0.73610 0.37581 0.24403 0.14931 0.04636 0.01074 10 2 0.92981 0.67780 0.52559 0.38278 0.16729 0.05469 10 3 0.98720 0.87913 0.77588 0.64961 0.38228 0.17188 10 4 0.99837 0.96721 0.92187 0.84973 0.63310 0.37695 10 5 0.99985 0.99363 0.98027 0.95265 0.83376 0.62305 10 6 0.99999 0.99914 0.99649 0.98941 0.94524 0.82813 10 7 1.00000 0.99992 0.99958 0.99841 0.98771 0.94531 10 8 1.00000 1.00000 0.99997 0.99986 0.99832 0.98926 10 9 1.00000 1.00000 1.00000 0.99999 0.99990 0.99902 \end{filecontents} % =============================== % =============================== % Tabelle Summierte Binomial-Verteilung (SumBinVert) % =============================== % =============================== % Farben in Tabelle ===================== \colorlet{FarbeOben}{pink} \colorlet{FarbeUnten}{lightgray!60} % =============================== % Allgemeine Formatierungen für Tabelle (Schrift etc.) festlegen \pgfplotstableset{ foreach column append style/.code 2 args = { \pgfplotsforeachungrouped \col in {#1} { \pgfplotstableset{ /pgfplots/table/columns/\col/.append style = {#2} } } } } % =============================== % Erste Zeile ========================= \def\SumBinVertHinweisEinsen{% {\text{\tiny Nicht aufgeführte Werte sind (gerundet auf $4$ Dezimalstellen) gleich $1.0000$}} }% % -------------------------- \def\SumBinVertFormel{% $\begin{matrix} \displaystyle P(X\leq k) = \sum_{v=0}^k \binom{n}{v} p^v (1-p)^{n-v} \\ \SumBinVertHinweisEinsen \end{matrix}$ }% % -------------------------- \newcommand\ErsteZeile{% \hhline{~|-------|} & \multicolumn{7}{c|}{\cellcolor{FarbeOben} \SumBinVertFormel} \\ \hhline{~|-------|} \rowcolor{FarbeOben} }% % ============================== % Letzte Zeile ======================== \def\SumBinVertHinweisGrauzeile{% {\tiny$ \begin{array}{l} \text{Bei grau unterlegtem Eingang, d.h. $p \geq 0{,}5$: } %\\ \text{$P(X\leq k) = 1 -\langle\texttt{Ablesewert}\rangle$} \end{array} $} }% % -------------------------- \newcommand\LetzteZeile{% \hhline{~|-------|-|} \rowcolor{FarbeUnten} \multicolumn{1}{c}{\cellcolor{white}} & \cellcolor{white} & $0{,}9$ & $0{,}8$ & $0{,}75$ & $0{,}7$ & $0{,}6$ & $0{,}5$ & \diagbox{$p$}{$k$} \\ % Anderes Design \hhline{~~|>{\arrayrulecolor{FarbeUnten}}------>{\arrayrulecolor{black}}|-|} % \rowcolor{FarbeUnten} \multicolumn{1}{c}{\cellcolor{white}} & \multicolumn{1}{c|}{\cellcolor{white}} & \multicolumn{7}{l|}{\SumBinVertHinweisGrauzeile} %& \cellcolor{FarbeUnten} \\ \hhline{~~|-------|} }% % ============================== % 1en ausblenden ==================== \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \typeout{##1=#1?}% Zu Debugging-Zwecken \ifdim \dimexpr ##1pt-#1pt>-0.00005pt \ifdim \dimexpr ##1pt-#1pt<0.00005pt \typeout{Ja}% Zur Kontrolle \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi \fi } }, } % ============================== % Tabellen einlesen \pgfplotstableread{n5.txt}{\SumBinVertTab} %\pgfplotstableread{n10.txt}{\nX} % "n Römische Zahl" % Tabellen zusammenführen % ToDO %%\pgfplotstableread{dataA.dat}\dataA %%\pgfplotstableread{dataB.dat}\dataB % %\pgfplotstablecreatecol[copy column from table={\nX}{[index] 0}] {par1} {\SumBinVertTab} %\pgfplotstablecreatecol[copy column from table={\nX}{[index] 1}] {par2} {\SumBinVertTab} % %\pgfplotstabletypeset{\SumBinVertTab} \\ % -------------------------- % Tabelle setzen \pgfplotstabletypeset[ % Allgemeine Einstellungen fixed zerofill, fixed, precision=4, % Null-Kommas Beseitigen %ignore chars={\.0}, % -------------------------- % Erste Zeile definieren every head row/.style = { before row={\ErsteZeile}, after row=\hline }, % -------------------------- % Letzte Zeile definieren every last row/.style = { after row={\LetzteZeile}, }, % -------------------------- % Nullte nSpalte definieren create on use/nSpalte/.style = {%% precision=0, column type={|c}, create col/assign/.code = {% \edef\nMethode{\ifnum \thisrow{1} = 0 \thisrow{0} \fi} \pgfkeyslet{/pgfplots/table/create col/next content}\nMethode },% },%% columns/nSpalte/.style = {% column name ={\cellcolor{white}$n$}, precision=0, column type={c}, },% % -------------------------- % Erste k-Spalte definieren columns/1/.style = { column name={\diagbox{$k$}{$p$}}, precision=0, column type={|>{\cellcolor{FarbeOben}\scriptsize}c|}, }, % -------------------------- % Letzte kSymSpalte definieren create on use/kSymSpalte/.style={% create col/expr={\thisrow{0}-1-\thisrow{1}}, },% columns/kSymSpalte/.style={% column name={\multicolumn1c{\cellcolor{white}}}, %$n-1-k$ column type={|>{\cellcolor{FarbeUnten}\scriptsize}c|}, precision=0 },% % -------------------------- % Übrige Spalten benenen columns/2/.style = {column name={$0{,}1$},discard if equal={1.0}}, columns/3/.style = {column name={$0{,}2$},discard if equal={1.0}}, columns/4/.style = {column name={$0{,}25$},discard if equal={1.0}}, columns/5/.style = {column name={$0{,}3$},discard if equal={1.0}}, columns/6/.style = {column name={$0{,}4$},discard if equal={1.0}}, columns/7/.style = {column name={$0{,}5$},discard if equal={1.0}}, % -------------------------- % Einsen beseitigen %discard if equal={1.0}, % ToDo: Wie nur auf columns 1-6 anwenden? % -------------------------- % "Null Komma" in Tabelle beseitigen % ToDo.... % -------------------------- % Allgemeine Formatierungen festlegen foreach column append style={nSpalte,2,3,4,5,6,7}{column type/.add={>{\scriptsize}}{}}, % Angezeigte Spalten definieren columns={nSpalte,1,2,3,4,5,6,7,kSymSpalte} ]{\SumBinVertTab} \bigskip %\def\getcell#1#2{ %\pgfplotstablegetelem{#1}{#2}\of{\SumBinVertTab}\pgfplotsretval% %} % %$P(X \leq k) = B(n,p;k) = \getcell{0}{2}$ % %$P(X = k) = P(X \leq k) - P(X \leq k-1) = B(n,p;k) - B(n,p;k-1) = ???$ \end{document} ![alt text][1] Eine andere Möglichkeit wäre, an der Stelle eine Rundung mit Hilfe von `pgfmath` durchzuführen. Da mit `\pgfround` nicht auf eine bestimmte Anzahl an Nachkommastellen, sondern nur auf Integer gerundet werden kann, muss man den Wert entsprechend skalieren. Die Lösung könnte in obigem Fall beispielsweise so aussehen: \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \pgfmathparse{ifthenelse(round(##1*10000)==round(#1*10000),0,1)}% \ifcase \pgfmathresult \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi } }, } Dabei wird auch gleich `\pgfifthenelse` verwendet, um den Vergleich durchzuführen. Sind die Werte gleich, wird `\pgfmathresult` so 0, sonst 1. Das Ergebnis ist wie in der Abbildung oben. Die genannten Funktionen von `pgfmath` sind in der `pgf`-Anleitung dokumentiert (derzeit Kapitel 89). Last but not least kann man natürlich auch die Funktion zur Festlegung der Nachkommastellen verwenden, die auch `pgfplotstable` bei der Ausgabe der Zahlen verwendet, also `\pgfmathroundto`: \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \pgfkeys{/pgf/number format/precision=4}% \pgfmathroundto{##1}% \ifdim \pgfmathresult pt=#1pt \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi } }, } oder mit `ifthenelse`: \pgfplotstableset{ discard if equal/.style = { preproc cell content/.code={ \pgfkeys{/pgf/number format/precision=4}% \pgfmathroundto{##1}% \pgfmathparse{ifthenelse(\pgfmathresult==#1,0,1)}% \ifcase \pgfmathresult \pgfkeyssetvalue{/pgfplots/table/@cell content}{} \fi } }, } Auch das liefert das gleiche Ergebnis wie oben bereits gezeigt. Dokumentiert ist `\pgfmathroundto` ebenfalls in der `pgf`-Anleitung, derzeit Kapitel 54. [1]: http://texwelt.de/wissen/upfiles/test28_2.pnghttp://texwelt.de/wissen/upfiles/test28_2.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3
Alternative mit Rundung durch pgfmath

21 Jan '16, 09:34

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

20 Jan '16, 17:05

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

20 Jan '16, 17:04

saputello's gravatar image

saputello
11.1k174365