Anzeige:
Ergebnis 1 bis 13 von 13

Thema: \ifnum mit Dezimalzahlen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer
    Registriert seit
    15.03.2012
    Beiträge
    4

    Question \ifnum mit Dezimalzahlen

    Hallo Leute.
    Ich tüftele seit einer Woche an einem Problem mit if-Abfragen herum. In einer Arbeit will ich den Signifikanzwert (p) so eingeben, wie er berechnet wurde (z. B. 0,00123). In der Ausgabe sollen die Werte dann gerundet bzw. übersetzt werden, üblich ist die Angabe (p < 0,05 oder, wenn p > 0,05 ist p = n. s. [nicht signifikant]).
    Mit Skriptsprachen habe ich etwas Erfahrung aber TeX treibt mich in den Wahnsinn.
    Folgendes Minimalbeispiel erzeugt im PDF zum Beispiel die Zeile
    Code:
    0.123: .123¡0.05p <= 0.05
    .
    Die \ifnum-Anweisung wird einfach ausgegeben! Beispiele wie einfache Schleifen in einem Latex-Kommando führen mich leider nicht weiter. Vielleicht könnt ihr mir helfen?!
    Die Angabe der Zahlen mit Komma (0,05) ändert nichts. Die Übersetzung nach ifthenelse mit dem ifthen-Paket erzeugt den gleichen Unsinn.

    Code:
    \documentclass{article}
    
    \newcommand*\pvalue[1]
    {
    	#1: 
    	\ifnum#1<=0.05%
    		p $<=0.05$		% wenn p <= 0.05
    	\else
    		$p = $ #1 (n.~s.)	% wenn p > 0.05 (nicht signifikant)
    	\fi
    	\\
    }
    
    \begin{document}
    
    \pvalue{0.123}\\
    \pvalue{0.0123}\\
    \pvalue{0.00123}\\
    \pvalue{0.000123}\\
    
    \end{document}

  2. #2
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Vielleicht wäre das fp Paket was:
    Code:
    \documentclass{article}
    \usepackage{fp}
    \def\mynum{}
    
    \newcommand*\pvalue[1]{%
      #1: %
      \FPset\mynum{#1}%
      \FPiflt\mynum{.05}%
        $p=$ #1 (n.~s.)%
      \else
        $p\geq0.05$%
      \fi
      , gerundet: \FPround\mynum\mynum{2}\FPprint\mynum
      }
    
    \begin{document}
    
    \pvalue{0.123}\\
    \pvalue{0.0123}\\
    \pvalue{0.00123}\\
    \pvalue{0.000123}
    
    \end{document}
    Gruß
    Clemens

  3. #3
    Registrierter Benutzer
    Registriert seit
    15.03.2012
    Beiträge
    4

    Thumbs up Danke

    Danke, Clemens! Das war der Druchbruch!
    Anbei ein Minimalbeispiel, falls noch jemand anderes außer mir mit Latex herumdoktort.
    Code:
    \documentclass{article}
    \usepackage{fp}
    
    %% Das Paket definiert viele Funktionen, hier sind die binären Verhältnisse relevant:
    	%introduction of new values
    		%\FPset#1#2		% #1 := #2  (#1 may be macro or string)
    	%%binary relations
    		%\FPiflt#1#2...\else...\fi % #1 < #2 ?
                 	%\FPifeq#1#2...\else...\fi % #1 = #2 ?
                 	%\FPifgt#1#2...\else...\fi % #1 > #2 
    
    
    \def\mynum{}
    \newcommand*\pvalue[1]{%
    	\FPset{\pval}{#1}%
    	\FPiflt{\pval}{.001}%
    		$p<0.001$%
    	\else
    		\FPiflt{\pval}{.01}%
    			$p<0.01$%
    		\else
    			\FPiflt{\pval}{.05}%
    				$p<0.05$%
    			\else
    				$p =$ n.~s.%		das %-Zeichen beendet die Zeile, damit keine Leerzeichen weitergegeben werden
    			\fi
    		\fi
      \fi
      }
    
    \begin{document}
    
    Es fand sich kein Unterschied in der Koerperhoehe der untersuchten Hunde (\pvalue{0.123}). Sie hatten jedoch ein unterschiedliches Alter (\pvalue{0.0123}) und unterschiedlich lange Schnautzen (\pvalue{0.00123}). Im Vergleich mit Maeusen unterschied sich die Koerpergroeße hoechst signifikant (\pvalue{0.000123}).
    
    \end{document}
    Geändert von texnicker (15-03-2012 um 12:58 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    15.03.2012
    Beiträge
    4

    doch noch noch ein Problem

    Beim Erstellen der PDF-Datei erscheint ein
    Code:
    extra \fi
    für alle Zahlen, die kleiner als 0.05 sind. Wenn die Schleife zum Beispiel bis \FPiflt{\pval}{.01} durchlaufen wird und dieser Wert true ist, dann wird $p<0.01$ ausgegeben und ein \fi ist zu viel. Bei Zahlen < 0,001 sogar zweimal. - Versteht jemand, warum? ... und vor allem, wie man das beheben kann?
    Reproduzierbar mit meinem Minimalbeispiel von oben.

  5. #5
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    eine alternative mit expl3:

    Code:
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{xparse}
    \ExplSyntaxOn
    \NewDocumentCommand \pvalue { m }
    {
      \dim_compare:nTF {#1 pt <= 0.05 pt } 
        { $p \leq 0.05$ }		% wenn p <= 0.05
        { $p =  #1~\text{(n.~s.)}$  }	% wenn p > 0.05 (nicht signifikant)
    }
    \ExplSyntaxOff
    \begin{document}
    
    \pvalue{0.123}\\
    \pvalue{0.0123}\\
    \pvalue{0.00123}\\
    \pvalue{0.000123}\\
    
    \end{document}
    Marco

  6. #6
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Sowas, wollte gerade dasselbe vorschlagen:
    Code:
    \documentclass{article}
    
    \usepackage{expl3}
    \ExplSyntaxOn
    \newcommand* \pvalue [1]
      {
        \fp_compare:nNnTF { #1 } < { .001 }
          { $p<0.001$ }
          {
            \fp_compare:nNnTF { #1 } < { .01 }
              { $p<0.01$ }
              {
                \fp_compare:nNnTF { #1 } < { .05 }
                  { $p<0.05$ }
                  { $p =$~n.~s. }
              }
          }
      }
    \ExplSyntaxOff
    \begin{document}
     \pvalue{.04}
     
     \pvalue{.005}
     
     \pvalue{.0005}
    \end{document}
    Verschachtelte \if -Abfragen sind immer tricky (finde auf die Schnelle leider nicht die Referenz, die ich im Hinterkopf habe). expl3 hat hier erstens die sichereren und zweitens die m.E. bequemeren Conditionals.

    An die Syntax muss man sich zwar erst gewöhnen, danach ist sie aber ziemlich selbsterklärend.

    Gruß
    Clemens

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •