DMUG-Archiv 2006

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

RE: Auf n gültige Ziffern runden?

Hallo Frank,

sorry, ich die Vorgabe nicht gleich richtig verstanden. Du hast Dein Problem
ja nun schon selbst gelöst aber vielleicht hilft das, Deine Laufzeiten zu
optimieren:

RoundTo[x_, n_] :=Module[{e, d}, 
    e=RealDigits[x];
    d=n-e[[2]];
    N[(SetPrecision[Round[x/(10^(e[[2]]-n))]/10^d,$MachinePrecision]),n]] 

RoundTo[1257.12474124895621,3]//N
RoundTo[0.00461293,3]

(-> nb siehe Anhang)

Das müßte dem entsprechen was Du als Vorgabe formuliert hast.


Mit freundlichen Grüßen

[André El-Ama]



-----Original Message-----
From: owner-demug@XXXXXXX.ch [mailto:owner-demug@XXXXXXX.ch] On
Behalf Of Frank Küster
Sent: Monday, April 10, 2006 1:29 PM
To: demug@XXXXXXX.ch
Subject: Re: Auf n gültige Ziffern runden?

"Andre El-Ama" <Andre@XXXXXXX.de> wrote:

> Hallo Frank,
>
> versuche es mal damit:
>
> Unprotect[Round];  Round[x_, n_] :=Module[{a, nR}, 
>      nR = Round[n]; 
>      a = 10^nR;  
>     (SetPrecision[Round[a x] // N,$MachinePrecision])/a  ];
> Protect[Round]; 
>
> Round[1257.12474124895621,15]

Nein, leider rundet das auf eine bestimmte Anzahl Stellen hinter dem
Komma, nicht auf gültige Ziffern:

Round[1257.12474124895621, 3]

ergibt 1257.125000000000, obwohl 1260 gefragt ist, und

Round[0.00461293, 3] 

ergibt 0.005, obwohl 0.00461 gewünscht ist.

Die Funktion, die ich stattdessen geschrieben habe, geht so:

RoundTo[number_, precision_] := 
  Module[{factor, multiplications},
    If[ number >= 10\^precision,
      factor = 0.1, 
      factor = 10
    ];
    multiplications = 0;
    RecursionResult = RoundToRecursive[number, precision, factor,
multiplications];
    Return[
      N[
        RecursionResult[[1]]/factor\^RecursionResult[[2]]
      ]
    ];
  ]
RoundToRecursive[number_, precision_, factor_, multiplications_] := 
  Module[{epsilon},
    epsilon = 10\^-10; \  (*needed because Round[2.5] gives 2*)
    If[ 10\^(precision - 1) <= number < 10\^precision,
      Return[
       { Round[number + epsilon], multiplications}
      ]
    ];
    newmultiplications = multiplications + 1;
    varnumber = number; (* warum gibt's einen Fehler, wenn ich number
                           direkt verändere?*)
    varnumber = varnumber*factor;
    RoundToRecursive[varnumber, precision, factor, newmultiplications]
  ]

In: {RoundTo[2.561, 2], RoundTo[0.03619, 3]}
Out: {2.6, 0.0362}

Im angehängten Notebook ist auch noch ein Anwendungsbeispiel zu sehen:

{{Mittelwert, Standardabweichung}, {list1mean, list1stddev}, {list2mean, 
      list2stddev}} // TableForm

Mittelwert          Standardabweichung
14.12               1.01341
46.8                20.9929

ist nicht gut lesbar, aber:

{{Mittelwert, Standardabweichung}, PrintMeanStdDev[{list1mean,
list1stddev}], 
    PrintMeanStdDev[{list2mean, list2stddev}]} // TableForm

Mittelwert          Standardabweichung
14.                 1.
47                  21

enthält alle wesentlichen Informationen.  PrintMeanStdDev ruft RoundTo
geeignet auf, man braucht kein Vorwissen über die Größenordnung der
Werte hineinstecken.  Das einzige was noch nach Gefühl geht (und derzeit
hardkodiert) ist die Entscheidung, wann die Standardabweichung mit zwei
gültigen Ziffern angegeben wird (derzeit wenn mean/stddev > 10).

Gruß, Frank
-- 
Frank Küster
Single Molecule Spectroscopy, Protein Folding @ Inst. f. Biochemie, Univ.
Zürich
Debian Developer (teTeX)

Attachment: exam_2a.nb
Description: Mathematica Notebook document

Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html