care este cel mai mic număr posibil? – Programarea cuvântului zilei

Marin Ben Oktiftevi Oktiftl
Marin Ben X-X-X-X-X-X-X-X-X-X

Follow

Aug 7, 2018 * 5 min citit

care este cel mai mic număr mai mare decât 0? Aceasta este una dintre acele întrebări simple cu răspunsuri complicate undeva între „nu există” și „depinde”.

dacă întrebați un matematician, vă vor spune că nu poate exista un astfel de număr, deoarece ar rupe matematica. Dacă aveți un număr n, unde n este cel mai mic număr după 0, atunci nu poate exista un număr n/2, deoarece N este deja cel mai mic. Aceasta înseamnă că diviziunea însăși se descompune, ceea ce matematicienilor nu le place.

dacă întrebați un computer, veți primi de fapt un răspuns. Spre deosebire de lumea reală, computerele nu au o cantitate infinită de numere, deoarece pur și simplu nu se potrivesc. Computerele stochează numere în registrele de memorie și fiecare registru are un număr fix de biți. Imaginați-vă dacă ați avea doar trei cifre. Cel mai mare număr pe care l-ați putea reprezenta ar fi 999. Asta se întâmplă într-un computer.

aceasta înseamnă că setul de numere întregi dintr-un computer este limitat de numărul de cifre. Într-un computer, există cu siguranță un număr mai mare (de exemplu, INT_MAX în C). Este numărul cu numărul maxim de cifre, toate acestea fiind setate la un binar 1. Pe un sistem pe 8 biți, acest număr ar fi 11111111.

putem complica și mai mult lucrurile prin includerea numerelor negative. Dacă avem 8 biți de date, putem folosi primul bit pentru a reprezenta semnul numărului. 0 pentru plus și 1 pentru minus. Acum avem 7 biți pentru cifrele noastre, deci cel mai mare număr este 011111111, care este mai mic decât cel mai mare număr anterior.

încă nu am terminat. De asemenea, trebuie să reprezentăm numere zecimale. Chiar dacă 0.12 este un număr mic, are încă trei cifre, la fel ca 123. Diferența este că mai este un lucru la care trebuie să ne gândim: punctul zecimal, numit și punctul radix. Trebuie să stocăm atât cifrele, cât și poziția punctului radix.

în timp ce numerele întregi sunt limitate în cât de mari pot fi, numerele zecimale sunt limitate atât în dimensiune, cât și în precizie. Dacă aveți un număr fix de cifre, există doar atât de multe cifre pe care le puteți pune după punctul zecimal. Acesta este motivul pentru care computerele trebuie să rotunjească numerele zecimale.

cum stocăm aceste numere zecimale? Computerele înțeleg doar numere întregi, așa că avem nevoie de o modalitate de a stoca un număr zecimal folosind doar numere întregi.

să spunem că avem numărul 3.14. Să începem prin a scrie toate cifrele numărului. Obținem 314. E un început. Știm că prin înmulțirea cu puteri de 10, putem „muta” punctul zecimal în jurul numărului. 314 * 10^-1 este 31,4, în timp ce 314 * 10^-2 este 3,14.

tot ce avem nevoie pentru a reprezenta numărul 3.14 sunt trei numere întregi: 314, 10 și -2. 314 este ceea ce se numește semnificativși acestea sunt toate cifrele numărului scris.

10 se numește radix sau bază. Știm că prin înmulțirea cu puteri de 10 putem muta punctul zecimal în jurul numerelor din Baza 10. Aceleași lucrări pentru toate bazele numerice: în baza 2 (sau binar), puteți schimba punctul prin înmulțirea cu puteri de 2.

puterea pe care o schimbăm se numește exponent și ne spune unde este punctul zecimal.

puteți scrie fiecare număr zecimal ca cele trei numere cu o formulă simplă:

number = significand * base^exponent3.14 = 314 * 10^-2
32.8 = 328 * 10^-1

un computer stochează un număr zecimal prin stocarea semnului, exponentului și semnificației într-un singur șir de cifre de 32 sau 64 de biți. De obicei, există 1 bit pentru semn, 11 biți pentru a stoca exponentul și 53 biți pentru a stoca significand, adăugând până la 64.

cu asta în minte, să ne întoarcem la întrebarea noastră: Care este cel mai mic număr diferit de zero? Dacă avem doar trei cifre de rezervă, cel mai mic număr posibil este 0,01. Cu patru cifre, este 0.001. Veți observa un model aici: semnificativulși este întotdeauna același, doar exponentul se schimbă.

avem nevoie de o semnificatie de 1, pentru ca aceasta este cea mai mica dupa 0. Apoi trebuie să mutăm punctul zecimal cât putem spre stânga. Pentru a face acest lucru avem nevoie de cel mai mic (cel mai negativ) exponent posibil.

cât de mic, depinde de aspectul numărului din memorie. Dacă avem 11 biți pentru exponent, putem scrie doar un număr care are 10 biți lungime, cu 1 bit rezervat semnului. Într-un sistem pe 64 de biți, cel mai mic exponent este -308.

în cele din urmă, cel mai mic număr posibil într-un sistem pe 64 de biți ar fi în jur de 1 * 10^-308. Asta e mic!

am stabilit că există un număr mai mic. Acest număr ne spune cât de mult putem avea încredere în computerul nostru. Dacă faceți ceva care necesită numere foarte mari sau numere foarte precise, trebuie să țineți cont de acest număr.

ceea ce tocmai am calculat este ceva numit unitatea în ultimul loc, sau ulp, de 0. În afară de a fi un cuvânt foarte cool, ulp ne spune care este distanța minimă dintre două numere dintr-un computer. Am calculat ulp de 0, care este distanța minimă dintre 0 și numărul următor.

dacă adăugați valoarea calculată la 0 și încercați să le comparați, acestea nu ar fi același număr. Cu toate acestea, dacă adăugați o valoare mai mică decât ulp, ar fi în continuare același număr în ceea ce privește computerul.

print(0 == 0 + ulp(0)) // false
print(0 == 0 + ulp(0) / 2) // true

pentru noi este evident că adăugarea unei valori diferite de zero la un număr va produce un număr diferit, dar un computer trebuie să rotunjească undeva, deci nu poate spune neapărat dacă două numere sunt aceleași.

pentru a compara mai ușor sistemele informatice, folosim ulp-ul 1 și îl numim mașina epsilon. Odată ce cunoașteți mașina epsilon, puteți calcula orice alt ulp cu următoarea formulă:

ulp(x) = machine epsilon * radix^exponent(x)

valoarea pe care am calculat-o este foarte mică, deci probabil că nu veți atinge această limită în timp ce codificați. Dar, am calculat valoarea pentru 0. Cu mai multe cifre necesare pentru partea stângă a punctului zecimal, cu atât mai puține avem pentru partea dreaptă. Aceasta înseamnă că, cu cât numărul este mai mare, cu atât aveți mai puțină precizie. Cu alte cuvinte, ulp este o funcție directă a exponentului. Pe măsură ce deplasați punctul zecimal spre dreapta, ulp crește și pierdeți precizia.

sper că aceste informații vă vor ajuta data viitoare când veți obține o eroare ciudată în virgulă mobilă în codul dvs. Amintiți-vă, computerele sunt destul de puternice, dar chiar și un computer are limitele sale.



+