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