| Frühere | Chronologischer Index | Spätere | ||
| Vorherige | Thematischer Index | Nächste |
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)
exam_2a.nb
Description: Mathematica Notebook document
| Frühere | Chronologischer Index | Spätere | ||
| Vorherige | Thematischer Index | Nächste |
DMUG-Archiv, http://www.mathematica.ch/archiv.html