Vra

So ek het besluit om te probeer om my fisika huiswerk te los deur die skryf van 'n paar luislang skrifte om probleme op te los vir my. Een probleem wat ek loop in is dat beduidende syfers nie altyd lyk behoorlik uit te kom. Byvoorbeeld hierdie hanteer beduidende syfers behoorlik:

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

Maar dit beteken nie:

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

So twee vrae:

  1. Is ek reg dat dit nie die verwagte bedrag van beduidende syfers, of moet ek borsel op beduidende syfer wiskunde?
  2. Is daar enige manier om dit te doen sonder om die desimale presisie hand stel? Toegestaan, ek is seker ek kan gebruik Numpy om dit te doen, maar ek wil net weet of daar 'n manier om dit te doen met die desimale module uit nuuskierigheid.
Was dit nuttig?

Oplossing

Die verandering van die desimale werk presisie tot 2 syfers is nie 'n goeie idee nie, tensy jy absoluut net gaan om 'n enkele operasie uit te voer.

Jy moet altyd uit te voer berekeninge by 'n hoër akkuraatheid as die vlak van betekenis, en net om die finale uitslag. As jy 'n lang reeks van berekeninge en rond om die aantal beduidende syfers by elke stap uit te voer, sal foute ophoop. Die desimale module nie weet of 'n bepaalde bedryf is een in 'n lang ry, of die finale uitslag, so dit veronderstel dat dit moet nie rond meer as wat nodig is. Die ideaal sou dit oneindige presisie te gebruik, maar dit is te duur so die Python ontwikkelaars gereeld vir 28 syfers.

As jy eers aangekom by die finale uitslag, wat jy waarskynlik wil hê, is Quantiseren:

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

Jy het om tred te hou van belang met die hand te hou. As jy 'n outomatiese betekenis dop wil, moet jy interval rekenkundige gebruik. Daar is 'n paar biblioteke beskikbaar vir Python, insluitend pyinterval en mpmath (wat arbitrêre presisie ondersteun). Dit is ook maklik om interval rekenkundige implementeer met die desimale biblioteek, aangesien dit word ondersteun deur gerig afronding.

Jy kan ook die Desimale Rekenkundige Vrae lees: Is die desimale rekenkundige 'betekenis 'n rekenkundige?

Ander wenke

Desimale sal weggooi nie desimale plekke soos daardie. As jy regtig wil om akkuraatheid te beperk tot 2 d.p. Probeer dan

decimal.getcontext().prec=2

EDIT:. Jy kan alternatiewelik Quantiseren noem () elke keer as jy vermenigvuldig of deel (optel en aftrek sal die 2 DPS te bewaar)

Net uit nuuskierigheid ... is dit nodig om die desimale module gebruik? Hoekom nie drywende punt met 'n beduidende-figure afronding van getalle wanneer jy gereed is om hulle te sien is? Of probeer jy om tred te hou van die beduidende syfers van die berekening te hou (soos wanneer jy 'n fout analise van 'n gevolg doen, die berekening van die berekende fout as 'n funksie van die onsekerhede wat gegaan het in die berekening)? As jy 'n afronding funksie wat rondes van die linkerkant van die aantal in plaas van die reg wil, probeer:

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 getalle sal reg lyk wanneer jy dit druk of hulle te skakel na snare, maar as jy besig is op die vinnige en moenie hulle uitdruklik druk kan hulle 'n bietjie kyk vreemd:

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

Desimale standaard 28 plekke van presisie.
Die enigste manier om die aantal syfers dit terug te beperk is deur die wysiging van die akkuraatheid.

As ek Desimale korrek undertand, die "akkuraatheid" is die nommer van syfers na die desimale punt in desimale notasie .

Dit lyk of jy iets anders wil: die aantal beduidende syfers. Dit is een meer as die nommer van syfers na die desimale punt in wetenskaplike notasie .

Ek sou belangstel in die leer oor 'n Python module wat beteken aansienlike-syfers-bewus drywende punt punt berekeninge wees.

Wat is verkeerd met drywende punt?

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

Dit is ontwerp vir wetenskaplike-styl berekeninge met 'n beperkte aantal beduidende syfers.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top