Cum aș putea schimba precizia unei variabile în Python? (Inginerie software, Python, Precizie Numerică)

FrigidDev a intrebat.
a intrebat.

Lucrez la un motor 2D-fizică și am nevoie ca o anumită variabilă să fie precisă doar la sutimi. Există vreo metodă pentru a rade practic toată această precizie inutilă?

Am încercat lucruri precum

"{0:.2f}".format(a)

dar asta produce, evident, un șir de caractere, nu un număr.

Mișc un obiect pe baza vitezei sale și vreau ca acesta să se oprească (evident) când valoarea sa este 0.0, dar continuă să meargă pentru că viteza sa este de fapt ceva de genul 0.0000562351.

Comentarii

  • Rotunjește-l la suta. tutorialspoint.com/python/number_round.htm. –  > Por Robert Harvey.
  • Ce încercați să obțineți de fapt? Încercați să reduceți consumul de memorie? Să accelerați calculele? Nu cunosc suficient de multe despre componentele interne ale Python, dar eliminarea preciziei s-ar putea să nu vă ajute în modul în care doriți. Dacă și o explicație a motivului pentru care vrei să faci acest lucru, probabil că vei primi răspunsuri mai bune care să te ajute, în loc să îți spună doar cum să schimbi valoarea stocată într-o variabilă. –  > Por unholysampler.
  • Da, această clarificare era absolut necesară, pentru că din cauza preciziei în virgulă mobilă ceea ce încerci tu nu va funcționa. –  > Por Izkata.
  • Cred că va trebui să găsesc o altă cale, mulțumesc pentru intuiție. –  > Por FrigidDev.
  • possible duplicate of Ce se poate face la limbajele de programare pentru a evita capcanele punctului flotant? – user40980
2 răspunsuri
jonrsharpe

Este tipic pentru a compara floats folosind o toleranță, mai degrabă decât prin egalitate. Acest lucru evită atât unele dintre problemele legate de aritmetica cu virgulă mobilă pe calculatoare, cât și permite să specificați un nivel de precizie adecvat. În cazul tău, dacă îți pasă doar de sutimi de unitate:

if abs(speed - limit) < 0.01:
    ...

De exemplu:

>>> abs(0.0 - 0.0000562351) < 0.01
True

Fuxi

Încercați să utilizați decimal modul.

Acesta permite manipularea preciziei. Cu context local ar trebui să obțineți suficientă flexibilitate.

Exemplu preluat din documentație:

from decimal import localcontext

with localcontext() as ctx:
    ctx.prec = 42   # Perform a high precision calculation
    s = calculate_something()
s = +s  # Round the final result back to the default precision

with localcontext(BasicContext):      # temporarily use the BasicContext
    print Decimal(1) / Decimal(7)
    print Decimal(355) / Decimal(113)

Comentarii

  • Cred că răspunsul dvs. este corect, dar permiteți-mi să vă sugerez să îl îmbunătățiți prin prezentarea unui fragment despre modul în care precizia este controlată de utilizator folosind decimal. (Știu că este chiar acolo, în documentație, dar ar face răspunsul mai coerent).  > Por logc.
  • Aveți dreptate @logc. S-a făcut 🙂 –  > Por Fuxi.