Frage

Also habe ich beschlossen, zu versuchen, meine Physik Hausaufgaben zu lösen, indem sie einige Python-Skripte zu schreiben Probleme für mich zu lösen. Ein Problem, das ich laufe in ist, dass signifikante Zahlen nicht immer scheinen richtig zu kommen. Zum Beispiel behandelt diese signifikanten Zahlen richtig:

from decimal import Decimal
>>> Decimal('1.0') + Decimal('2.0')
Decimal("3.0")

Aber das bedeutet nicht:

>>> Decimal('1.00') / Decimal('3.00')
Decimal("0.3333333333333333333333333333")

So zwei Fragen:

  1. Bin ich richtig, dass dies nicht die erwartete Menge an signifikanten Stellen ist, oder muß ich bis auf signifikante Stelle Mathematik auffrischen?
  2. Gibt es eine Möglichkeit, dies zu tun, ohne manuell die Dezimalgenauigkeit einstellen zu müssen? Zugegeben, ich bin sicher, dass ich dies zu tun verwende numpy kann, aber ich will nur wissen, ob es eine Möglichkeit, ist das mit dem Dezimalsystem Modul aus Neugier zu tun.
War es hilfreich?

Lösung

Ändern die Dezimalzahl Arbeitsgenauigkeit zu 2 Ziffern ist nicht eine gute Idee, wenn Sie absolut nur eine einzige Operation ausführen werden.

Sie sollten immer Berechnungen mit höherer Präzision durchführen als das Niveau von Bedeutung, und nur um das Endergebnis. Wenn Sie eine lange Folge von Berechnungen und rund um die Anzahl der signifikanten Stellen bei jedem Schritt durchführen, werden Fehler akkumulieren. Der dezimale Modul nicht weiß, ob eine bestimmte Operation einen in einer langen Sequenz ist, oder das Endergebnis, so dass es davon ausgeht, dass es sollte nicht rund mehr als nötig. Ideal wäre es unendlich Präzision zu verwenden, aber das ist zu teuer, so dass der Python-Entwickler für 28 Stellen angesiedelt.

Wenn Sie auf das Endergebnis angekommen sind, was Sie wollen wahrscheinlich ist Quantisierungsraster:

>>> (Decimal('1.00') / Decimal('3.00')).quantize(Decimal("0.001"))
Decimal("0.333")

Sie haben manuell Spur von Bedeutung zu halten. Wenn Sie die automatische Bedeutung Tracking wollen, sollten Sie Intervallarithmetik verwenden. Es gibt einige Bibliotheken für Python, einschließlich pyinterval und mpmath (was beliebige Genauigkeit unterstützt). Es ist auch einfach Intervallarithmetik mit dem Dezimalsystem Bibliothek zu implementieren, da es Rundung gerichtet unterstützt.

Sie können auch die Dezimalarithmetik FAQ zu lesen: Ist Dezimalarithmetik ‚Bedeutung‘ Arithmetik?

Andere Tipps

Dezimalzahlen nicht wegwerfen Dezimalstellen so. Wenn Sie wirklich wollen Präzision 2 d.p. begrenzen dann versuchen

decimal.getcontext().prec=2

EDIT:. Sie können alternativ Quantisierungsraster () aufrufen, jedes Mal wenn Sie multiplizieren oder dividieren (Addition und Subtraktion werden die 2 dps erhalten)

Nur aus Neugier ... ist es notwendig, das Dezimalsystem Modul zu benutzen? Warum floating nicht Punkt mit einer signifikanten Figuren Runden von Zahlen, wenn Sie bereit sind, sie zu sehen? Oder versuchen Sie den Überblick über die wesentlichen Zahlen der Berechnung zu halten (wie wenn Sie eine Fehleranalyse eines Ergebnisses zu tun, den berechneten Fehler in Abhängigkeit von den Unsicherheiten der Berechnung, die in die Berechnung ging)? Wenn Sie eine Rundungsfunktion mögen, statt rechts von der linken Seite der Anzahl Runden, versuchen Sie:

def lround(x,leadingDigits=0): 
    """Return x either as 'print' would show it (the default) 
    or rounded to the specified digit as counted from the leftmost 
    non-zero digit of the number, e.g. lround(0.00326,2) --> 0.0033
    """ 
    assert leadingDigits>=0 
    if leadingDigits==0: 
            return float(str(x)) #just give it back like 'print' would give it
    return float('%.*e' % (int(leadingDigits),x)) #give it back as rounded by the %e format  

Die Zahlen werden richtig angezeigt, wenn Sie sie drucken oder in Strings umwandeln, aber wenn Sie an der Eingabeaufforderung arbeiten und sie explizit nicht drucken können sie ein wenig seltsam aussehen:

>>> lround(1./3.,2),str(lround(1./3.,2)),str(lround(1./3.,4))
(0.33000000000000002, '0.33', '0.3333')

Dezimal standardmäßig auf 28 Plätze an Präzision.
Die einzige Möglichkeit, die Anzahl der Stellen zu begrenzen es zurückgibt, ist durch die Genauigkeit zu verändern.

Wenn ich Dezimal richtig undertand, die "Präzision" ist die Anzahl der Stellen nach dem Komma in Dezimalschreibweise .

Sie scheinen etwas anderes zu wollen: die Anzahl der signifikanten Stellen. Das ist eine mehr als die Anzahl der Stellen nach dem Komma in wissenschaftliche Schreibweise .

würde mich interessieren, über ein Python-Modul in das Lernen, das tut signifikanten einstelligen-aware Punkt Punkt Berechnungen schweben.

Was ist los mit Floating-Point?

>>> "%8.2e"%  ( 1.0/3.0 )
'3.33e-01'

Es wurde mit einer begrenzten Anzahl von signifikanten Stellen wissenschaftlich-Stil Berechnungen ausgelegt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top