Der Befehl "discard if equal={1.0}" von @Henri

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
% 1en ausblenden ====================
\pgfplotstableset{
discard if equal/.style = {
preproc cell content/.code={
\ifdim##1pt=#1pt
\pgfkeyssetvalue{/pgfplots/table/@cell content}{}
\fi
}
},
}
% ==============================
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

wird in folgender Tabelle manchmal nicht ausgeführt.

Woran kann das liegen? Und wie korrigiert man das?

alt text

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
%\documentclass[varwidth, border=10pt]{standalone}
\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}
% ===============================
% ===============================
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

gefragt 20 Jan '16, 16:40

cis's gravatar image

cis
9.6k103460491
Akzeptiert-Rate: 29%

1

\ifdim tut wunderbar. Allerdings werden Zahlen wie 0.99999 erst nach dem Vergleich auf vier Nachkommastellen gerundet, was dann 1.0000 ergibt.

(20 Jan '16, 17:04) Henri

Mit

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
\pgfplotstableset{
discard if equal/.style = {
preproc cell content/.code={
\typeout{##1=#1?}%
\ifdim##1pt=#1pt
\pgfkeyssetvalue{/pgfplots/table/@cell content}{}
\fi
}
},
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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:

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
\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)
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

alt text

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:

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
\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
}
},
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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:

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
\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
}
},
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

oder mit ifthenelse:

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
\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
}
},
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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:

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
\pgfplotstableset{
discard if equal/.style = {
preproc cell content/.code={
\pgfkeys{/pgf/fpu/rel thresh=5e-5}%
\pgfmathfloatifapproxequalrel{##1}{#1}{%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{}
}{}
}
},
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

All das liefert das gleiche Ergebnis wie oben bereits gezeigt. Dokumentiert sind \pgfmathroundto und \pgfmathfloatifapproxequalrel ebenfalls in der pgf-Anleitung, derzeit Kapitel 54.

Permanenter link

beantwortet 20 Jan '16, 17:04

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 21 Jan '16, 10:15

Super. Danke!

(20 Jan '16, 17:21) cis

Mit expl3 kann man eine Zahl leicht auf beliebig viele Nachkommastellen runden. Dazu verwendet man einfach round(x,n), wobei x auf n Stellen gerundet wird.

Open in Online-Editor
Code, hier editierbar zum Übersetzen:
%\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \fpcompare { m m }
{
\fp_compare:nT { #1 } { #2 }
}
\ExplSyntaxOff
\pgfplotstableset{
discard if equal/.style = {
preproc cell content/.code={
\fpcompare{round(##1,4) == #1}{%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{}
}
}
},
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

alt text

Permanenter link

beantwortet 20 Jan '16, 17:26

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 20 Jan '16, 18:26

Deine Antwort
[Vorschau ausblenden]

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Frage-Themen:

×258
×39

gestellte Frage: 20 Jan '16, 16:40

Frage wurde gesehen: 7,715 Mal

zuletzt geändert: 21 Jan '16, 10:15