Pentru ce numere se folosește reprezentarea semnată? Reprezentarea numerelor într-un computer

Datele numerice sunt procesate într-un computer în sistem binar Socoteala. Numerele sunt stocate în memoria computerului în cod binar, adică ca o secvență de zerouri și unu, și pot fi reprezentate în format fix sau flotant.

Numerele întregi sunt stocate în memorie în format fix. Cu acest format pentru reprezentarea numerelor, un registru de memorie format din opt celule de memorie (8 biți) este alocat pentru stocarea numerelor întregi nenegative. Fiecare cifră a unei celule de memorie corespunde întotdeauna aceleiași cifre a numărului, iar virgula este situată în dreapta după cifra cea mai puțin semnificativă și în afara grilei de biți. De exemplu, numărul 110011012 ar fi stocat într-un registru de memorie după cum urmează:

Tabelul 4

Valoarea maximă a unui număr întreg nenegativ care poate fi stocat într-un registru în format de virgulă fixă ​​poate fi determinată din formula: 2n – 1, unde n este numărul de cifre ale numărului. Numărul maxim va fi egal cu 28 - 1 = 25510 = 111111112 și minimul 010 = 000000002. Astfel, intervalul de modificări ale numerelor întregi nenegative va fi de la 0 la 25510.

Spre deosebire de sistemul zecimal, sistemul de numere binar în reprezentarea computerizată a unui număr binar nu are simboluri care să indice semnul numărului: pozitiv (+) sau negativ (-), prin urmare, pentru a reprezenta numere întregi cu semn în sistemul binar, două se folosesc formate de reprezentare a numerelor: formatul valorii numerelor semnate și formatul complementului a doi. În primul caz, două registre de memorie (16 biți) sunt alocate pentru stocarea numerelor întregi cu semn, iar cifra cea mai semnificativă (cel mai din stânga) este folosită ca semn al numărului: dacă numărul este pozitiv, atunci 0 este scris în bitul de semn. , dacă numărul este negativ, atunci 1. De exemplu, numărul 53610 = 00000010000110002 va fi reprezentat în registrele de memorie în urmatoarea forma:

Tabelul 5

și un număr negativ -53610 = 10000010000110002 sub forma:

Tabelul 6

Numărul maxim pozitiv sau numărul minim negativ în formatul valorii numărului cu semn (ținând cont de reprezentarea unei cifre pe semn) este 2n-1 – 1 = 216-1 – 1 = 215 – 1 = 3276710 = 11111111111111112 și intervalul de numere va fi de la - 3276710 la 32767.

Cel mai adesea, pentru a reprezenta numerele întregi cu semne în sistemul binar, se utilizează formatul de cod complementar al celor două, care vă permite să înlocuiți operația aritmetică de scădere într-un computer cu o operație de adunare, care simplifică semnificativ structura microprocesorului și crește performanța acestuia. .

Pentru a reprezenta numerele întregi negative în acest format, se folosește codul complement a doi, care este modulul unui număr negativ la zero. Conversia unui întreg negativ în complement a doi se realizează folosind următoarele operații:


1) scrieți modulul numărului în cod direct în n (n = 16) cifre binare;

2) obțineți codul invers al numărului (inversați toate cifrele numărului, adică înlocuiți toate cifrele cu zerouri și zerourile cu unu);

3) adăugați una la cifra cea mai puțin semnificativă la codul invers rezultat.

De exemplu, pentru numărul -53610 în acest format, modulul va fi 00000010000110002, codul reciproc va fi 1111110111100111, iar codul suplimentar va fi 1111110111101000.

Trebuie amintit că complementul unui număr pozitiv este numărul însuși.

Pentru a stoca numere întregi cu semne altele decât pe 16 biți reprezentare pe calculator atunci când este folosit două registre de memorie(acest format de numere se mai numește și format de număr întreg cu semn scurt), sunt utilizate formatele întregi cu semn mediu și lung. Pentru a reprezenta numerele în formatul numărului mijlociu se folosesc patru registre (4 x 8 = 32 de biți), iar pentru a reprezenta numerele în formatul numărului lung se folosesc opt registre (8 x 8 = 64 de biți). Intervalele de valori pentru formatele de număr mediu și lung vor fi, respectiv: -(231 – 1) ... + 231 – 1 și -(263-1) ... + 263 – 1.

Reprezentarea computerizată a numerelor în format punct fix are avantajele și dezavantajele sale. LA beneficii includ simplitatea reprezentării numerelor și algoritmi pentru implementarea operațiilor aritmetice dezavantajele sunt gama finită de reprezentare a numerelor, care poate fi insuficientă pentru rezolvarea multor probleme de natură practică (matematice, economice, fizice etc.).

Numerele reale (finite și infinite zecimale) sunt procesate și stocate pe computer în format virgulă mobilă. Cu acest format de reprezentare a numărului, poziția punctului zecimal în intrare se poate modifica. Orice număr real K în format virgulă mobilă poate fi reprezentat ca:

unde A este mantisa numărului; h – baza sistemului de numere; p – ordinea numerelor.

Expresia (2.7) pentru sistemul numeric zecimal va lua forma:

pentru binar -

pentru octal -

pentru hexazecimal -

Această formă de reprezentare a numerelor se mai numește normal . Odată cu schimbarea în ordine, virgula din număr se deplasează, adică pare să plutească spre stânga sau spre dreapta. Prin urmare, se numește forma normală de reprezentare a numerelor formă în virgulă mobilă. Numărul zecimal 15,5, de exemplu, în format virgulă mobilă poate fi reprezentat ca: 0,155 102; 1,55 101; 15,5 100; 155,0 10-1; 1550.0 10-2 etc. Acest formular de înregistrare numar decimal 15.5 virgulă mobilă nu este folosită la scriere programe de calculatorși introducerea lor în computer (dispozitivele de intrare pe computer percep doar înregistrarea liniară a datelor). Pe baza acestui fapt, expresia (2.7) pentru reprezentarea numerelor zecimale și introducerea lor în computer este convertită în forma

unde P este ordinea numărului,

adică, în locul bazei sistemului numeric 10, ei scriu litera E, în loc de virgulă, punct, iar semnul înmulțirii nu este plasat. Deci, numărul 15,5 este în format virgulă mobilă și înregistrare liniară(reprezentare pe computer) se va scrie ca: 0,155E2; 1,55E1; 15,5E0; 155,0E-1; 1550.0E-2 etc.

Indiferent de sistemul numeric, orice număr sub formă de virgulă mobilă poate fi reprezentat printr-un număr infinit de numere. Această formă de înregistrare se numește nenormalizat . Pentru o reprezentare fără ambiguitate a numerelor în virgulă mobilă, se utilizează o formă normalizată de scriere a unui număr, în care mantisa numărului trebuie să îndeplinească condiția

unde |A| - valoare absolută mantise de numere.

Condiția (2.9) înseamnă că mantisa trebuie să fie o fracție proprie și să aibă o cifră diferită de zero după virgulă, sau, cu alte cuvinte, dacă mantisa nu are un zero după virgulă, atunci numărul se numește normalizat. . Deci, numărul 15,5 în formă normalizată (mantisă normalizată) în formă de virgulă mobilă va arăta astfel: 0,155 102, adică mantisa normalizată va fi A = 0,155 și ordinul P = 2, sau în reprezentarea computerizată a numărului 0,155E2 .

Numerele în virgulă mobilă au un format fix și ocupă patru (32 de biți) sau opt octeți (64 de biți) din memoria computerului. Dacă un număr ocupă 32 de biți în memoria computerului, atunci acesta este un număr de precizie obișnuită dacă este de 64 de biți, atunci acesta este un număr precizie dubla. Când se scrie un număr în virgulă mobilă, biții sunt alocați pentru a stoca semnul mantisei, semnul exponentului, mantisei și exponentului. Numărul de cifre alocat ordinii numărului determină gama de variație a numerelor, iar numărul de cifre alocat pentru stocarea mantisei determină precizia cu care este specificat numărul.

Atunci când se efectuează operații aritmetice (adunare și scădere) pe numere prezentate în format virgulă mobilă, se implementează următoarea procedură (algoritm):

1) se aliniază ordinea numerelor pe care se efectuează operațiile aritmetice (ordinea numărului mai mic în valoare absolută crește la ordinea numărului mai mare în valoare absolută, mantisa scade de același număr de ori);

2) se efectuează operații aritmetice pe mantisele numerelor;

3) rezultatul obținut este normalizat.

Partea practică

Scopul serviciului. Calculatorul online este conceput pentru a reprezenta numere reale în format virgulă mobilă.

Număr

reprezentat în sistemul numeric 10 2.
Reprezentați numărul în:
forma exponentiala normalizata
formă exponenţială denormalizată
Format IEEE 754 pe 32 de biți
Format IEEE 754 pe 64 de biți
Convertiți înapoi la notație zecimală

Reguli pentru introducerea numerelor

  1. Numerele din sistemul numeric zecimal pot fi introduse fie fără o fracție, fie cu parte fracționată (234234.455).
  2. Numerele din sistemul de numere binar constau numai din cifrele 0 și 1 (10100.01).
  3. Numerele din sistemul numeric hexazecimal constau din cifrele 0...9 și literele A...F.
  4. Puteți obține, de asemenea, reprezentarea inversă a codului (de la sistem hexazecimal calcul zecimal, 40B00000)
Exemplul nr. 1. Reprezentați numărul 133,54 sub formă de virgulă mobilă.
Soluţie. Să reprezentăm numărul 133,54 în formă exponențială normalizată:
1,3354*10 2 = 1,3354*exp 10 2
Numărul 1,3354*exp 10 2 este format din două părți: mantisa M=1,3354 și exponentul exp 10 =2
Dacă mantisa este în intervalul 1 ≤ M Reprezentarea unui număr în formă exponențială denormalizată.
Dacă mantisa este în intervalul 0,1 ≤ M Să reprezentăm numărul în formă exponențială denormalizată: 0,13354*exp 10 3

Exemplul nr. 2. Reprezentați numărul binar 101.10 2 în formă normalizată, scrisă în standardul IEEE754 pe 32 de biți.
Soluţie.
Reprezentarea unui număr binar în virgulă mobilă în formă normalizată exponențială.
Să deplasăm numărul cu 2 cifre la dreapta. Ca rezultat, am obținut principalele componente ale unui număr binar normalizat exponențial:
Mantisa M=1,011
Exponent exp 2 =2
Convertiți numărul binar normalizat în formatul IEEE 754 pe 32 de biți.
Primul bit este alocat pentru a indica semnul numărului. Deoarece numărul este pozitiv, primul bit este 0
Următorii 8 biți (de la 2 la 9) sunt rezervați exponentului.
Pentru a determina semnul exponentului, pentru a evita introducerea unui alt bit de semn, adăugați un offset la exponentul de jumătate de octet +127. Deci exponentul nostru este: 2 + 127 = 129
Să convertim exponentul în reprezentare binară.
Restul de 23 de biți sunt rezervați mantisei. Într-o mantisă binară normalizată, primul bit este întotdeauna egal cu 1, deoarece numărul se află în intervalul 1 ≤ M Pentru a converti partea întreagă, trebuie să înmulțiți cifra numărului cu puterea cifrei corespunzătoare.
01100000000000000000000 = 2 22 *0 + 2 21 *1 + 2 20 *1 + 2 19 *0 + 2 18 *0 + 2 17 *0 + 2 16 *0 + 2 15 *0 + 2 14 *0 + 2 13 *0 + 2 12 *0 + 2 11 *0 + 2 10 *0 + 2 9 *0 + 2 8 *0 + 2 7 *0 + 2 6 *0 + 2 5 *0 + 2 4 *0 + 2 3 *0 + 2 2 *0 + 2 1 *0 + 2 0 *0 = 0 + 2097152 + 1048576 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = 3145728
În cod zecimal, mantisa este exprimată ca 3145728
Ca rezultat, numărul 101.10 reprezentat în IEEE 754 cu precizie unică este egal cu.
Să convertim la reprezentare hexazecimală.
Să împărțim sursăîn grupuri de 4 categorii.
2 = 0100 0000 1011 0000 0000 0000 0000 0000 2
Primim numarul:
0100 0000 1011 0000 0000 0000 0000 0000 2 = 40B00000 16

Numerele întregi pot fi reprezentate fără semnătură sau semnate într-un computer.

numere întregi fără semn. Numerele întregi fără semn ocupă de obicei 1 sau 2 octeți în memoria computerului și iau valori de la 00000000 2 la 11111111 2 în format pe un singur octet și de la 00000000 00000000 2 la 11111111 111111111 11111112 2 octeți.

Întreg numere semnate. Numerele întregi cu semn ocupă de obicei 1, 2 sau 4 octeți în memoria computerului, bitul din stânga (cel mai semnificativ) conține informații despre semnul numărului. Semnul „+” este codificat ca zero, iar „-” ca unul (Tabelul 2.3).

Să ne uităm la caracteristicile scrierii numerelor întregi cu semn folosind exemplul unui format pe un singur octet, în care o cifră este alocată pentru semn și o cifră pentru cifre valoare absolută- șapte cifre.

ÎN tehnologia calculatoarelor Se folosesc trei forme de înregistrare (codificare) a numerelor întregi cu semn: cod direct, cod invers, cod complementar. Ultimele două forme sunt utilizate în mod deosebit pe scară largă, deoarece fac posibilă simplificarea proiectării dispozitivului aritmetic-logic al unui computer prin înlocuirea diferitelor operații aritmetice cu operația de adunare.

Numerele pozitive în codurile directe, inverse și complement sunt reprezentate în același mod - coduri binare cu numărul 0 în bitul de semn.

Tabelul 2.2 Domenii de valori întregi fără semn

Numărul 1,® = 1 2: Numărul 127 10 = 1111111 2:

0000000 10 1111111

Semnul numeric „-”| Semnul numeric „-”

Numerele negative din codurile directe, inverse și complement au imagini diferite.

Cod direct pentru numărul -1: Cod direct pentru numărul -127:

1OOOOOOoT11111111

Semnul numeric „+” Semnul numeric „+”

Cod direct: cifra 1 este plasată în bitul de semn, iar cifrele părții digitale a numărului sunt cod binar valoarea sa absolută.

Codul invers se obține inversând toate cifrele codului binar, valoarea absolută a numărului, inclusiv bitul de semn: zerourile sunt înlocuite cu unu, iar cele cu zerouri.

Exemple.

Numărul 1. Număr: -127.

Cod modul numeric: 00000001 Cod modul numeric: 01111111

Cod de număr invers: 11111110 Cod de număr invers: 10000000

Codul complementar se obține prin formarea codului invers și apoi adăugarea unuia la cifra sa cea mai puțin semnificativă.

Cod de număr suplimentar -1: Cod de număr suplimentar -127:

R

11111110 10000000

11111111 10 0 0 0 0 0 1

Folosind coduri directe, inverse și complementare, puteți reduce operația de înmulțire la o secvență de adunări și deplasări, iar operația de împărțire la adăugarea repetată a unui cod de divizor suplimentar la Divizor.

De obicei, numerele zecimale negative, atunci când sunt introduse într-o mașină, sunt convertite automat în cod binar invers sau complementar și în această formă sunt stocate, mutate și participate la operații. Când astfel de numere sunt scoase de la aparat, ele sunt convertite înapoi în numere zecimale negative.

Numere reale. Numerele reale (zecimale finite și infinite) sunt stocate și procesate într-un computer în format virgulă mobilă. În acest caz, poziția punctului zecimal în număr se poate modifica.

Formatul în virgulă mobilă se bazează pe notație științifică, în care poate fi reprezentat orice număr. Da, numărul A poate fi reprezentat sub formă

A = t-q",

Unde T - mantisa numărului; q- baza sistemului de numere; P- ordinea numerelor.

Pentru a asigura reprezentarea fără ambiguitate a numerelor în virgulă mobilă, se utilizează o formă normalizată, în care mantisa îndeplinește condiția

1/i = \T\< 1.

Aceasta înseamnă că mantisa trebuie să fie o fracție adecvată și să aibă o cifră diferită de zero după virgulă.

Exemple. Să convertim numerele în formă exponențială cu o mantise normalizată:

421,637 = 0,421637 10 3 ;

0,000286 = 0,286 10" 4 ;

25,25 = -2,525 10 2 .

Un număr în virgulă mobilă ocupă 4 (precizie obișnuită) sau 8 (precizie dublă) în memoria computerului. Când se scrie un număr în virgulă mobilă, biții sunt alocați pentru a stoca semnul mantisei, exponentului, exponentului și

mantisa.

Operatii aritmetice. La adăugarea și scăderea numerelor în format virgulă mobilă, se efectuează mai întâi o operație pregătitoare de aliniere a comenzii. Ordinea numărului mai mic (modulo) crește la ordinea numărului (modulo) mai mare. Pentru ca valoarea numărului să nu se modifice, mantisa este redusă de același număr de ori (deplasată în celula de memorie la dreapta cu un număr de cifre egal cu diferența în ordinea numerelor).

După efectuarea operației de aliniere, aceiași biți de numere sunt localizați în aceleași biți de celule de memorie. Acum operațiile de adunare și scădere a numerelor se reduc la adunarea sau scăderea mantiselor.

După efectuarea unei operații aritmetice pentru a reduce numărul rezultat la format standard cu virgulă mobilă se realizează normalizarea, adică. Mantisa este deplasată la stânga sau la dreapta, astfel încât prima sa cifră semnificativă să cadă în prima zecimală.

Exemplu. Adăugați numerele 0,1 * 2 3 și 0,1 2 5 în format virgulă mobilă.

Să aliniem ordinele și să adăugăm mantisele:

+ 0,100 -2 5

La înmulțirea numerelor în format virgulă mobilă, ordinele sunt adăugate și mantisele sunt înmulțite. La împărțire, ordinea divizorului este scăzută din ordinea dividendului, iar mantisa dividendului este împărțită la mantisa divizorului.

Exemplu.Înmulțiți numerele 0,1 2 3 și 0,1 2 5 în format virgulă mobilă.

După înmulțire se va obține numărul 0,01 2 8, care după normalizare va lua forma 0, 1 2 7 .

2.1.7. Reprezentarea altor tipuri de informații pe un computer Toate tipurile de informații (text, grafic, sunet, video) sunt codificate într-o succesiune de zerouri și unu. Să ne uităm la acest proces mai detaliat.

Codare binară informații text. În mod tradițional, pentru a codifica un caracter, cantitatea de informații utilizată este de 1 octet, adică 8 biți (2 8 = 256), astfel încât 256 de caractere diferite pot fi codificate.

Acest număr de caractere este suficient pentru a reprezenta informații text, inclusiv majuscule și litere mari Alfabetul rus și latin, numere, semne, simboluri grafice etc.

Codarea constă în atribuirea fiecărui caracter unic cod zecimal de la 0 la 255 sau codul său binar corespunzător de la 00000000 la 11111111.

Când un utilizator apasă o tastă de caractere de pe tastatură, o secvență de opt impulsuri electrice (codul binar al caracterului) este trimisă în memoria computerului. Codul simbolului este stocat în memorie cu acces aleator computer, unde ocupă o celulă de memorie.

În procesul de afișare a unui simbol pe ecranul computerului, se efectuează procesul invers - decodificare, adică. conversia unui cod de caracter în imaginea acestuia.

Atribuirea unui cod specific unui simbol este o chestiune de convenție, care este înregistrată în tabelul de coduri. Primele 33 de coduri (de la O la 32) corespund nu unor caractere, ci unor operații (avans de linie, introducerea unui spațiu etc.).

Codul a fost adoptat ca standard internațional Tabelul ASCII (Standard american Cod pentru Schimbul de informații) (Fig. 2.1, A), codificarea primei jumătăţi a caracterelor cu coduri numerice de la 32 la 126.

Cronologic, unul dintre primele standarde pentru codificarea literelor rusești pe computere a fost KOI8 („Cod de schimb de informații, 8 biți”). Această codificare a fost folosită de la mijlocul anilor 1980. a început să fie folosit în primele versiuni rusificate ale sistemului de operare UNIX.

Standardele naționale de tabel de coduri includ partea internațională a tabelului de coduri fără modificări și coduri ale alfabetelor naționale, simboluri pseudografice și unele simboluri matematice.

Orez. 2.1. Exemple de tabele de codificare:

A- international Codificare ASCII; b- codificare CP1251

Cea mai comună codificare utilizată în prezent este Microsoft Windows, desemnat CP1251 (de la Engleză Pagina de cod - pagina de cod) (Fig. 2.1, b).

La sfârşitul anilor 1990. a apărut una nouă standard international Unicode, care alocă nu 1 octet, ci 2 octeți pe caracter, deci poate fi folosit pentru a codifica nu 256, ci 65.536 de caractere diferite. Specificația completă a standardului Unicode include toate alfabetele existente, dispărute și create artificial din lume, precum și multe simboluri matematice, muzicale, chimice și alte simboluri.

Codarea binară a informațiilor grafice. Imaginile grafice stocate în formă analogică (continuă) pe hârtie, fotografice și film pot fi convertite în digital format de calculator prin eșantionare spațială. Acest lucru este implementat prin scanare, al cărei rezultat este o imagine raster. Imagine raster constă din puncte individuale - pixeli (de la Engleză element imagine - element imagine), fiecare dintre ele poate avea propria sa culoare.

Calitatea imaginii este determinată de rezoluția monitorului, adică de numărul de puncte din care este compusă. Cu cât rezoluția monitorului este mai mare, adică cu cât este mai mare numărul de linii raster și de puncte pe linie, cu atât calitatea imaginii este mai mare. În modern calculatoare personale Există patru rezoluții principale ale ecranului utilizate în mod obișnuit: 640 x 480, 800 x 600, 1024 x 768 și 1280 x 1024 pixeli.

Imaginile color sunt generate conform codului binar de culoare al fiecărui pixel stocat în memoria video. Imaginile color pot avea diferite adâncimi de culoare, care sunt determinate de numărul de biți utilizați pentru a codifica culoarea unui punct (Tabelul 2.4).

Imaginea color de pe ecranul monitorului este formată prin amestecarea a trei culorile de bază: rosu, verde si albastru. Astfel de model de culoare numit model RGB (din engleza Red, Green, Blue - red, green, blue). Pentru a obține o paletă bogată

Tabelul 2.4 Adâncimea culorii și numărul de culori afișate

Tabelul 2.5 Formarea culorilor la adâncimea de culoare de 24 de biți

flori ry culorile de bază pot fi specificate intensități diferite De exemplu, cu o adâncime de culoare de 24 de biți, sunt alocați 8 biți pentru fiecare culoare, adică pentru fiecare culoare, sunt posibile 2 8 = 256 de niveluri de intensitate, specificate în coduri binare (de la minim - 00000000. la maxim - 11111111) (Tabelul 2.5).

Pentru ca o imagine să se formeze pe ecranul monitorului, informațiile despre fiecare dintre punctele sale (codul de culoare, puncte) trebuie să fie stocate în memoria video a computerului. Să calculăm cantitatea necesară de memorie video pentru unul dintre moduri grafice, de exemplu, cu o rezoluție de 800 x 600 pixeli și o adâncime de culoare de 24 de biți per pixel. Total de puncte pe ecran: 800.600 = 480.000 Cantitate necesară de memorie video: 24 de biți 480.000 = 11.520.000 de biți = = 1.440.000 de octeți = 1406,25 KB = 1,37 MB.

Codarea binară a informațiilor audio. Sunetul reprezintă unda de sunet cu amplitudine și frecvență în continuă schimbare. Cu cât amplitudinea semnalului este mai mare, cu atât este mai puternic pentru oameni; Cu cât frecvența semnalului este mai mare, cu atât tonul este mai mare. Pentru a

computerul ar putea procesa sunetul, continuu semnal sonor trebuie convertit într-o succesiune de impulsuri electrice (zerouri și unuuri binare).

Astfel, dependența continuă a amplitudinii semnalului de timp La) este înlocuită cu o secvență discretă de niveluri de volum.

Orez. 2.2. Grilă de niveluri de cuantizare.

Prelevarea de probe- procesul de rupere a unui semnal în componente individuale preluate. anumit momente de ceas timp t 0 , I t 2 ,… Prin intervale de ceas clar definite / (Figura 2.2).

Cuantizare -înlocuirea componentelor individuale ale valorii semnalului discret original cu cel mai apropiat nivel de cuantizare, deplasate unul față de celălalt printr-un interval numit pas de cuantizare:

d/ 0) = 2; L(/,) = 5; A(t 2)= 6; La 3)= 6; A(U) = 5; La 5)= 5; La 6)= 6;

La 7)= 6; Ah)= 5.

Codificare- traducerea valorii nivelului de cuantizare într-un cod binar specific, de exemplu:

2-0010; 6-0110; 6-0110; 5-0101; 5-0101; 6-ONO; 6-0110; 5-0101; 4-0100.

Calitate informatiile transmise asta va depinde de:

Din capacitatea de conversie, adică numărul de biți binari care vor fi utilizați la codificarea nivelului corespunzător;

Rate de eșantionare - frecvența la care semnal analog vor fi convertite în formă digitală folosind unul dintre sistemele numerice.

Nivelurile volumului sunetului pot fi gândite ca un set de stări posibile. Prin urmare, decât număr mai mare nivelurile de volum vor fi evidențiate în timpul procesului de codificare, deci cantitate mare informațiile vor purta semnificația fiecărui nivel și cu atât sunetul va fi mai bun. Placi de sunet furnizează, de exemplu, adâncimea de codificare audio de 16 biți, oferind 2 16 = 65.536 nivele de semnal.

În plus, calitatea codificării depinde și de numărul de puncte de măsurare a nivelului de semnal în 1 s, adică de frecvența de eșantionare (această valoare variază de la 8000 la 48.000).

Se obișnuiește să se măsoare frecvența de eșantionare în kHz (kiloherți): 1 kHz reprezintă 1000 de măsurători pe secundă.

Puteți estima volumul de informații al unui fișier audio stereo cu o durată a sunetului de 1 s la calitate superioară audio (16 biți, 48 kHz). Pentru a face acest lucru, numărul de biți per probă trebuie înmulțit cu numărul de eșantioane în 1 s și înmulțit cu 2 (modul stereo):

16 biți 48.000 -2=1.536.000 biți = 192.000 octeți 187,5 KB.

Volumul de informații fișier de sunet durează 1 minut aproximativ egal cu 11 MB.

Întrebări de control

1. Cum diferă sistemele de numere poziționale de cele nepoziționale?

2. Câte informații conține un număr? număr octal?

3.De ce folosește un computer sistemul de numere binar?

4.Care este avantajul formei exponenţiale a unui număr?

5.Cum sunt codificate caracterele text?

6. Care este metoda de eșantionare spațială?

7. Convertiți 1110 2 în sistemul numeric zecimal; 22 8; BF l 6; 10110 2 ;

135 8; 70 GBP 16.

8. Convertiți numere zecimale în sisteme de numere binare, octale și hexazecimale: 74,21; 26,11; 125,01; 114.08.

9. Convertiți perechi de numere în sistemul numeric binar, efectuați operații aritmetice, verificați răspunsurile: 36 și 4; 75 și 5; 12 și 4; 123 și 3.

10. În ce sistem numeric sunt valabile următoarele egalități:

20 + 25= 100; 22+ 44 =110?

11.Numărul zecimal 59 este echivalent cu numărul 214 într-un alt sistem numeric. Găsiți baza acestui sistem.

12.Convertiți numerele în zecimale și apoi verificați rezultatele efectuând conversii inverse:

14. Înmulțiți numerele și apoi verificați rezultatele făcând
înmulțiri zecimale corespunzătoare:

101101 2 101 2 111101 2 - P,012

1011,11 2 101,1 2 101 2 -1111,001 2

15. Împărțiți 10010110 2 la 1010 2 și verificați rezultatul înmulțind divizorul cu câtul.

16.Scrieți numerele în cod direct(format de 1 octet):

17. Notați numerele în coduri reciproce și complementare (format de 1 octet):

18 Găsiți reprezentările zecimale ale numerelor scrise în plus
cod nativ:

11111000 10011011

11101001 10000000

19. Scădeți numerele adunând reciprocele lor (adițional
prescurtat) coduri în format de 1 octet (indicați în ce cazuri are
locul depășirii grilei de biți):

20.Codați folosind tabelul CP1251 și reprezentați cuvântul „informații” în notație hexazecimală.

21.De ce uneori pe ecranul monitorului, în loc de informații text, puteți vedea 00DD, etc.?

22. Alături de tastele alfanumerice, tastatura conține taste precum , , etc. Au cod zecimal?

23. Cu o rezoluție de 1280 x 1024 pixeli, determinați cantitatea de memorie video la adâncimea de culoare High Color.

24. Cât poate „cântări”, adică. Care este dimensiunea unui fișier cu un videoclip care durează 5 secunde?

25. Câte puncte conține imaginea dacă, la codificarea fiecărui punct pe 1 octet, fișierul rezultat are o dimensiune de 300 KB?

Informații generale.

Tip de date este un cod binar care are proprietăți cunoscute conform convențiilor acceptate. Procesorul (folosind comenzi) recunoaște tipul de date și efectuează un set prescris de operații asupra datelor.

Următoarele tipuri de date sunt discutate mai jos:

● s numere întregi semnate și fără semn, folosit pentru a reprezenta numere întregi sub formă de coduri binare și pentru a efectua operații aritmetice asupra acestora după regulile aritmeticii binare;

numere întregi BCD, conceput pentru a reprezenta și procesa numere zecimale;

tip de date boolean, susținând regulile algebrului-logicii (algebră booleană);

tipuri fixe și în virgulă mobilă, destinat reprezentării și prelucrării numerelor reale.

Alegerea tipului de date este determinată de comanda programului. De exemplu, la executarea unei instrucțiuni aritmetice, datele sunt tratate ca numere întregi, operanzii din operația logică sunt acceptați ca tipuri de date booleene, iar pointerul de 16 biți este folosit de instrucțiune pentru a accesa datele din segmentul curent.

Rețineți că în programele în limbi nivel inalt Pot exista tipuri de date pentru care procesorul nu are suport hardware. Un exemplu ar fi tipurile de date în virgulă mobilă într-un program Fort Run care rulează sistem de calcul fără coprocesor. În acest caz, calculele folosesc comenzi suplimentare pentru modelarea tipurilor de date în virgulă mobilă. Desigur, dacă există un co-procesor în sistem (și un compilator Fortran pentru acesta), programul se va executa mult mai rapid.

Despre formele de reprezentare a numerelor.

Două forme sunt utilizate pe scară largă pentru a reprezenta numere: naturală și normală.

La natural sub formă de reprezentare, numărul are un singur tip de înregistrare, de exemplu: +195 - întreg pozitiv; –195 este un număr întreg negativ; +0,025 - fracție proprie pozitivă; –195,025 este o fracție negativă improprie. Această formă este folosită pentru a reprezenta numere întregi și numere cu virgulă fixă ​​(virgulă).

La normal forma de reprezentare, numărul este scris în formular

unde M, P sunt mantisa și ordinea numărului.

Forma normală de reprezentare este caracterizată printr-o notație ambiguă a numărului, de exemplu: +195,025 = +195025. 10 –3 = +19,5025. 10 1 = +0,195025 . 10 3. După cum se poate vedea din exemplu, poziția punctului mantisei depinde de valoarea ordinului P. Cu o modificare a lui P (care se întâmplă întotdeauna în timpul procesului de calcul), punctul pare să înceapă să plutească. Prin urmare, forma normală (2.3.1) se mai numește și forma reprezentării numerelor în virgulă mobilă.

Informațiile numerice (ca orice altă) care fac obiectul prelucrării procesatorului sunt reprezentate în formular

– coduri binare de biți, pentru stocarea celulelor de memorie utilizate. Codurile numerice binare au formate diferite.

Formatul numărului este un set de cifre (grilă de biți), împărțit în câmpuri separate: câmpul semnului numeric, câmpul modulului numeric, câmpul mantisei, câmpul modulului de ordine etc. Pentru a numerota cifrele câmpurilor, o secvență de se folosesc numere, începând de la zero (0, 1, 2, 3, …).

numere întregi fără semn.

Acest tip de date este utilizat pentru a reprezenta valori întregi zero și pozitive.

În fig. 2.3.1, și sunt date formatele numerelor întregi de 8 biți. Nu există un bit de semn, deci intervalul de numere este 0...2

Adâncimea de biți a codului binar este aceeași cu lățimea de biți a numărului.

numere întregi semnate.

Operația de scădere a două numere pozitive A și B poate fi considerată ca o operație de adunare algebrică a numerelor cu semne diferite: A – B = A + (–

). Prin urmare, pentru a înlocui operația aritmetică de scădere cu operația de adunare algebrică, este necesar să se reprezinte cumva semnul numărului. De obicei, un bit suplimentar este alocat pentru semnul unui număr binar. Semnul numărului este indicat în cifra cea mai semnificativă: 0 corespunde semnului pozitiv „+” al numărului, 1 - semnului negativ „–”.

Pentru a reprezenta numerele cu semne, este utilizat pe scară largă adiţional cod.

Pentru a reprezenta numere întregi pozitiv numere binare în

– în codul de complement al bitului, toți biții cei mai semnificativi (inclusiv bitul de semn) trebuie să fie umpluți cu zerouri.

Pentru prezentare negativ numere necesare:

● inversează toate cifrele digitale semnificative (modulul) unui număr;

● adăugați unul la valoarea rezultată;

● completați toate cifrele cele mai semnificative (inclusiv cifrele semnului) cu unele.

De exemplu, codul complementar pe doi pe 8 biți pentru numărul pozitiv +6 este 00000110, iar pentru numărul negativ 6 - 11111010.

În fig. 2.3.1, b arată formatele numerelor cu semn de 8 biți în codul de complement a doi. Intervalul de reprezentare a acestora este – 2 (

–1) - capacitatea de cifre a părții semnificative a numărului. Microprocesoarele moderne acceptă numere întregi semnate de 16, 32 și 64 de biți. Există două formate de numere întregi utilizate în mod obișnuit: mic de statura cu numărul de cifre

Și lung cu numărul de cifre 2

În procesul de calcul este utilizat format lung, rezultatele sunt afișate într-un format scurt. Dacă numărul de cifre semnificative ale modulului unui număr depășește (

– 1), grila de biți depășește, ducând la o eroare în reprezentarea numărului din cauza pierderii celor mai semnificativi biți ai modulului. După efectuarea operațiilor aritmetice, rezultatul care iese din interval este marcat prin setarea steagului de depășire O la unu

Numerele cu punct fix.

În forma naturală de reprezentare a numerelor reale, poziția punctului (virgulă) este fixată între părțile întregi și fracționale ale numărului. Pentru a schimba poziția unui punct într-un număr real, este necesar să se introducă un factor de scară, a cărui valoare trebuie aleasă astfel încât să păstreze valoarea neschimbată. numar real. Adesea, punctul este fixat înaintea celor mai semnificative cifre ale modulului numărului. În acest caz, reprezentarea numărului A cu un punct fix are forma unei fracții proprii, care corespunde condiției

Numărul selectat de cifre semnificative ale unui număr.

Condiția (2.3.2) trebuie îndeplinită pentru datele inițiale ale problemei și toate rezultatele intermediare ale calculelor, care este asigurată prin alegerea factorului de scară K.

Dacă condiția (2.3.2) este încălcată, numărul А Ф are o parte întreagă, care se pierde deoarece nu intră în grila de biți din cauza depășirii. Prin urmare, atunci când se determină factorul de scară K, se procedează de la valoarea maximă a modulului numerelor implicate în rezolvarea problemei, luând K> | A |

Atunci condiția (2.3.2) pentru А Ф = А/К va fi îndeplinită.

În fig. 2.3.2, iar formatul reprezentării computerizate a numerelor AF cu punct fix este dat. Când numărul AF este introdus într-o celulă de memorie, cifrele de ordin inferior libere ale grilei de biți sunt umplute cu zerouri. Dacă numărul

cifre semnificative ale modulului |

– 1, apoi biții de ordin inferior ai modulului care nu se potrivesc

– grilă de biți, sunt pierdute. Aceasta duce la o eroare, a cărei valoare absolută este mai mică decât una dintre cifrele cele mai puțin semnificative ale grilei de biți, adică

32 eroare absolută

0,5×10 – 30x0,3 = 0,5×10 – 9

Să fie date două numere A = –1010,101 2 și B = +10,10101 2, pentru care |

Prin urmare, factorul de scară K > |

2 4 = 10000 2. Puterea 4 indică necesitatea deplasării numerelor originale cu 4 cifre la dreapta

Într-adevăr

A.K= –1010,101. 10000 =

–0.1010101 2 ;

V F = V. K = 10,10101. 10000 = 0,001010101 2 . Formatele de reprezentare a numerelor А Ф și В Ф sunt prezentate în Fig. 2.3.2.6, c. Pentru a menține acuratețea reprezentării computerului a numărului VF, este necesară extinderea grilei de biți la 10 biți.

Avantajul reprezentării numerelor în formă de virgulă fixă ​​este ușurința de a efectua operații aritmetice. Dezavantajele sunt că:

● este necesară selectarea factorilor de scară;

● zerourile din cei mai semnificativi biți ai modulului duc la scăderea numărului de biți ocupați de partea semnificativă a modulului numărului. Ca urmare, acuratețea reprezentării numerelor cu valori mici de modul scade.

Tipuri booleene.

Valorile booleene sunt nesemnate și sunt folosite în operațiuni logice

etc. Operația se realizează pe biți individuali. Operanzii booleeni sunt procesați în părți dacă capacitatea lor de biți depășește capacitatea de biți a procesorului.

Numerele întregi zecimale binare.

ÎN Viata de zi cu zi oamenii folosesc sistemul numeric zecimal. Pentru a stoca și procesa numere zecimale în dispozitive digitale sunt reprezentate ca cod binar. O reprezentare a unui număr zecimal în care fiecare cifră zecimală este reprezentată de caracterele binare 0 și 1 se numește BCD. Deoarece alfabetul sistemului zecimal este format din 10 cifre, fiecare cifră zecimală este scrisă într-un cuvânt care conține cel puțin patru cifre. Cel mai des folosit este un cuvânt de 4 biți numit tetradă sau nibble. Folosind tetrade, în loc de 10 necesar, puteți obține 2 4 = 16 combinații diferite de simboluri combinate 0 și 1. Cu codificarea zecimală binară, diferite cifre zecimale trebuie să corespundă diverse combinatii simbolurile O și 1, adică doar 10 combinații din 16 sunt permise Prezența combinațiilor permise și interzise -. proprietate importantă coduri zecimale binare. Această proprietate îi deosebește de obișnuiți sisteme de pozitionare Numerele în care sunt permise toate combinațiile. Numărul total de diferite coduri de 4 biți (tetrade) permise, determinate prin combinații de 16 elemente din 10, este: C 10 16 = 18008. Așa-numitul cod 8421, care utilizează primele zece valori ale numerelor binare din 0000 (0 10), este utilizat pe scară largă până la 1001 (9 10).

Avantajul codurilor pe 4 biți este că la codificarea numerelor zecimale se folosește un număr minim de cifre. Introducerea unei a 5-a cifre suplimentare vă permite să detectați erorile în timpul transmisiei informatii numerice peste liniile de comunicație în prezența interferențelor. De exemplu, într-un cod de 5 biți 2 din 5, toate combinațiile de coduri conțin doi unu și trei zerouri. Prin urmare, schimbarea oricărei cifre (la valoarea opusă) va duce la o combinație de cod interzisă.

În fig. 2.3.3 arată formatul unui număr zecimal binar care conține 18 tetrade (

0) și semnă bit

(biții rămași ai octetului înalt sunt setați la valori zero). Fiecare tetradă corespunde unei zecimale.

Numere în virgulă mobilă.

În multe cazuri, pentru a efectua calcule este necesar să se prezinte numere cu precizie ridicată V gamă largă valorile. Îndeplinește cerințele specificate forma normala numere (2.3.1). Pentru a identifica caracteristicile utilizării sale pentru reprezentarea numerelor în virgulă mobilă în sisteme digitale vom presupune că:

● să scrie mantisa, (

1) – cod binar de biți, cu cel mai mare ordin (

–-a) cifră determină semnul mantisei (numărul), cifrele rămase determină modulul mantisei. Valoarea modulului mantisei |M|< 1, что соот-ветствует фиксации точки перед значащими цифрами (разрядами) модуля мантиссы;

● pentru înregistrarea ordinului P se utilizează cod binar (p + 1) de biți, cea mai semnificativă (p-a) cifră determinând semnul comenzii, cifrele rămase determinând modulul comenzii. Ordinea P (întreg) indică poziția reală a punctului în număr.

În fig. 2.3.4, iar formatul unui număr în virgulă mobilă este dat.

Precizia reprezentării numerelor (2.3.1) depinde de numărul de cifre semnificative (cifre) ale mantisei. Pentru a îmbunătăți acuratețea, numerele în virgulă mobilă sunt prezentate într-o formă normalizată, care este indicată de prezența unei cifre semnificative (una pentru

2) în cifra cea mai semnificativă a modulului mantisei. Valoarea modulului mantisei normalizate la

2 se află în 2 –1 ≤ |M|< 1 (для любых порядков П). В нормализованной форме могут быть представлены все числа из некоторого диапазона за исключением нуля.

Să-l reprezentăm în format virgulă mobilă numere binare A = +10010,10101 și B = –111,0101. Să scriem A și B în formă normalizată

A = +0,1001010101. 2 5 , V= –0,1110101000 . 2–3.

Pe baza (2.3.4), scriem modulele mantisei |M

| = 10010101012, |M

| = 1110101000 2 și comandați module în sistemul binar |P A | = 5 10 = 0101 2 , |P

| = 3 10 = 0011 2 . Alege numărul total cifre ale grilei de biți

P = 16. Acceptăm numărul de cifre pentru modulul mantisă ca 10, pentru modulul de comandă ca 4.

Formatele numerelor A și B sunt prezentate în Fig. 2.3.4, 6, c. Mantisa și ordinea operandului B, care au o valoare negativă, sunt reprezentate în cod suplimentar:

|# + 1 = 0001010111 + 1 = 0001011110;

|# + 1 = 0011 + 1 = 0100, unde # este inversiunea.

Deoarece eroarea absolută în reprezentarea numerelor în virgulă mobilă depinde de ordinea lui P, vom da o estimare a erorii relative:

/ 2 –1 = 2 –(

Eroare absolută de reprezentare a modulului

– biți mantisă; |

22 –1 - valoarea minima modulul normalizat al mantisei.

Rețineți că în standard

754/854 utilizează o ordine sub forma P = P – E, unde E =

Compensarea comenzii; P max = 2E. Acest lucru ne-a permis să excludem domeniul

semnul de comandă în format de reprezentare a numărului.

În vremurile străvechi, pentru industria IT era anii 70 ai secolului trecut, matematicienii (cum erau numiți anterior programatorii) luptau ca Don Quijote într-o luptă inegală cu computerele, care atunci aveau dimensiunea unor mici mori de vânt. Sarcinile erau serioase: căutarea submarinelor inamice în ocean folosind imagini de pe orbită, calcularea balisticii rachetelor raza lunga, Și așa mai departe. Pentru a le rezolva, computerul trebuie să opereze cu numere reale, care, după cum știm, sunt un continuum, în timp ce memoria este finită. Prin urmare, trebuie să mapam acest continuum pe un set finit de zerouri și unu. În căutarea unui compromis între viteza, dimensiunea și acuratețea reprezentării, oamenii de știință au propus numere în virgulă mobilă (sau în virgulă mobilă, dacă sunt în burghezie).

Din anumite motive, aritmetica în virgulă mobilă este considerată un câmp exotic informatică, având în vedere că tipurile de date corespunzătoare sunt prezente în fiecare limbaj de programare. Sincer să fiu, nu am acordat niciodată prea multă importanță aritmeticii computerului, în timp ce rezolvând aceeași problemă pe CPU și GPU, am obținut rezultate diferite. S-a dovedit că fenomene foarte curioase și ciudate sunt ascunse în colțurile secrete ale acestei zone: non-comutativitatea și neasociativitatea operațiilor aritmetice, semnul zero, diferența numere egale dă zero și așa mai departe. Rădăcinile acestui aisberg pătrund adânc în matematică, iar sub tăietură voi încerca să contur doar ceea ce se află la suprafață.

1. Bazele

Mulțimea numerelor întregi este infinită, dar putem alege întotdeauna un număr de biți pentru a reprezenta orice număr întreg care apare la rezolvarea sarcina specifica. Mulțimea numerelor reale nu este doar infinită, ci și continuă, așa că indiferent de câți biți luăm, inevitabil vom întâlni numere care nu au o reprezentare exactă. Numerele în virgulă mobilă sunt unul dintre moduri posibile reprezentarea numerelor reale, care reprezintă un compromis între acuratețe și intervalul de valori acceptate.

Un număr în virgulă mobilă constă dintr-un set de cifre individuale, împărțite în mod convențional în semn, exponent și mantisă. Exponentul și mantisa sunt numere întregi care, împreună cu semnul, dau următoarea reprezentare a unui număr în virgulă mobilă:

Matematic se scrie asa:

(-1) s × M × B E, unde s este semnul, B este radixa, E este exponentul și M este mantisa.

Baza determină sistemul numeric al cifrelor. S-a dovedit matematic că numerele în virgulă mobilă cu baza B=2 (reprezentare binară) sunt cele mai rezistente la erorile de rotunjire, prin urmare, în practică, se întâlnesc numai bazele 2 și, mai rar, 10. Pentru o prezentare ulterioară, vom presupune întotdeauna B =2, iar formula pentru un număr cu virgulă mobilă va arăta astfel:

(-1) s × M × 2 E

Ce este mantisa și ordinea? mantisa este un număr întreg cu lungime fixă ​​care reprezintă cei mai semnificativi biți numar real. Să presupunem că mantisa noastră este formată din trei biți (|M|=3). Luați, de exemplu, numărul „5”, care în sistemul binar va fi egal cu 101 2. Cel mai semnificativ bit corespunde lui 2 2 =4, bitul mijlociu (pe care îl avem egal cu zero) 2 1 =2, iar cel mai mic 2 0 =1. Ordin– aceasta este puterea bazei (două) a celei mai mari cifre. În cazul nostru E=2. Este convenabil să scrieți astfel de numere în așa-numita formă standard „științifică”, de exemplu „1.01e+2”. Este imediat clar că mantisa constă din trei semne, iar ordinea este două.

Să presupunem că vrem să obținem un număr fracționar folosind aceiași 3 biți ai mantisei. Putem face acest lucru dacă luăm, să zicem, E=1. Atunci numărul nostru va fi egal

1.01e+1 = 1×2 1 +0×2 0 +1×2 -1 =2+0.5=2.5

Aici, deoarece E=1, puterea a două din prima cifră (care vine înainte de virgulă zecimală) este „1”. Celelalte două cifre situate în dreapta (după virgulă zecimală) oferă o contribuție de 2 E-1 și 2 E-2 (2 0 și, respectiv, 2 -1). Este evident că prin ajustarea lui E același număr poate fi reprezentat în moduri diferite. Să luăm în considerare un exemplu cu lungimea mantisei |M|=4. Numărul „2” poate fi reprezentat astfel:

2 = 10 (în binar) = 1.000e+1 = 0.100e+2 = 0.010e+3. (E=1, E=2, respectiv E=3)

Vă rugăm să rețineți că același număr are mai multe reprezentări. Acest lucru nu este convenabil pentru echipament, deoarece... este necesar să se ţină cont de multiplicitatea reprezentării la compararea numerelor şi la efectuarea operaţiilor aritmetice asupra acestora. Mai mult, nu este economic, deoarece numărul de reprezentări este finit, iar repetarea reduce numărul de numere care pot fi reprezentate. Prin urmare, deja în primele mașini au început să folosească un truc, făcând primul bit al mantisei întotdeauna pozitiv. Această prezentare a fost numită normalizat.

Acest lucru economisește un bit, deoarece cel implicit nu trebuie să fie stocat în memorie și asigură că numărul este reprezentat unic. În exemplul nostru, „2” are o singură reprezentare normalizată („1.000e+1”), iar mantisa este stocată în memorie ca „000”, deoarece unitatea conducătoare este implicită. Dar în reprezentarea normalizată a numerelor apare noua problema- este imposibil de reprezentat zero în această formă.

Strict vorbind, un număr normalizat are următoarea formă:

(-1) s × 1.M × 2 E .

Calitatea rezolvării problemelor depinde în mare măsură de alegerea reprezentării în virgulă mobilă. Am abordat treptat problema standardizării unei astfel de reprezentări.

2. Puțină istorie

În anii 60 și 70, nu exista un standard unic pentru reprezentarea numerelor în virgulă mobilă, a metodelor de rotunjire sau a operațiilor aritmetice. Drept urmare, programele erau extrem de neportabile. Dar de asemenea problema mai mare avea ce diferite computere erau niște „ciudățeni” și trebuiau cunoscute și luate în considerare în program. De exemplu, diferența a două numere inegale a returnat zero. Ca urmare, expresiile „X=Y” și „X-Y=0” au intrat în conflict. Meșterii au rezolvat această problemă cu trucuri foarte inteligente, de exemplu, făcând atribuirea „X=(X-X)+X” înainte de operațiile de înmulțire și împărțire pentru a evita problemele.

Inițiativa de a crea standard unic pentru reprezentarea numerelor în virgulă mobilă a coincis în mod suspect cu încercările din 1976 ale Intel de a dezvolta o aritmetică „mai bună” pentru noile coprocesoare 8086 și i432. Dezvoltarea a fost întreprinsă de oamenii de știință din acest domeniu, prof. John Palmer și William Kahan. Acesta din urmă, într-un interviu, și-a exprimat părerea că seriozitatea cu care Intel și-a dezvoltat aritmetica a forțat alte companii să se unească și să înceapă procesul de standardizare.

Toată lumea a vorbit serios, pentru că este foarte profitabil să-ți promovezi arhitectura și să o faci standard. DEC, National Superconductor, Zilog și Motorola și-au prezentat propunerile. Producătorii de mainframe Cray și IBM au urmărit de pe margine. Compania Intel, desigur, și-a prezentat și noua ei aritmetică. Autorii specificației propuse au fost William Kahan, Jeromy Kunen și Harold Stone, iar propunerea lor a fost imediat supranumită „K-C-S”.

Aproape imediat, toate propunerile, cu excepția a două, au fost respinse: VAX de la DEC și „K-C-S” de la Intel. Specificația VAX era mult mai simplă, era deja implementată în computerele PDP-11 și era clar cum să obțineți performanță maximă. Pe de altă parte, „K-C-S” conținea o mulțime de funcționalități utile, cum ar fi numere „speciale” și „denormalizate” (detalii mai jos).

În „K-C-S” toți algoritmii aritmetici sunt strict specificați și se cere ca rezultatul implementării să coincidă cu aceștia. Acest lucru permite efectuarea unor calcule stricte în cadrul acestei specificații. Dacă anterior un matematician a rezolvat o problemă folosind metode numerice și a dovedit proprietățile soluției, nu exista nicio garanție că aceste proprietăți vor fi păstrate în program. Rigoarea aritmeticii K-C-S a făcut posibilă demonstrarea teoremelor folosind aritmetica în virgulă mobilă.

DEC a făcut totul pentru a face ca specificațiile sale un standard. Ea a obținut chiar și sprijinul unor oameni de știință de renume că aritmetica K-C-S nu ar putea, în principiu, să atingă aceeași performanță ca DEC. Ironia este că Intel a știut să facă ca specificațiile sale ca fiind performante, dar aceste trucuri erau un secret comercial. Dacă Intel nu ar fi cedat și nu și-ar fi dezvăluit unele dintre secretele sale, nu ar fi fost capabilă să rețină asaltul DEC.

Pentru mai multe despre bătăliile de standardizare, vedeți interviul profesorului Kahan și ne vom uita la cum arată acum reprezentarea în virgulă mobilă.

3. Reprezentarea numerelor în virgulă mobilă astăzi

Dezvoltatorii K-C-S au câștigat și acum ideea lor a devenit standardul IEEE754. Reprezintă numere în virgulă mobilă ca semn (s), mantisă (M) și exponent (E) după cum urmează:

(-1)s × 1.M × 2 E

Cometariu.În noul standard IEE754-2008, pe lângă numerele cu baza 2, există numere cu baza 10, așa-numitele zecimal numere (zecimale) în virgulă mobilă.

Pentru a nu copleși cititorul cu informații excesive care pot fi găsite pe Wikipedia, vom lua în considerare un singur tip de date, o singură precizie (float). Numerele de precizie jumătate, duble și extinse au aceleași caracteristici, dar au o gamă diferită de ordine și mantisă. În numerele de precizie unică (float/single), ordinea constă din 8 biți, iar mantisa - din 23. Ordinea efectivă este definită ca E-127. De exemplu, numărul 0,15625 ar fi stocat în memorie ca

Cifra luată de pe Wikipedia

În acest exemplu:

  • Semnul s=0 (număr pozitiv)
  • Comanda E=01111100 2 -127 10 = -3
  • Mantissa M = 1,01 2 (prima unitate nu este explicită)
  • Ca rezultat, numărul nostru F = 1,01 2 e-3 = 2 -3 +2 -5 = 0,125 + 0,03125 = 0,15625

O explicație puțin mai detaliată

Aici avem de-a face cu o reprezentare binară a numărului „101” cu punctul zecimal deplasat de câteva locuri spre stânga. 1.01 este o reprezentare binară care înseamnă 1×2 0 + 0×2 -1 + 1×2 -2 . Mutând virgulă zecimală cu trei poziții la stânga obținem 1.01e-3 = 1×2 -3 + 0×2 -4 + 1×2 -5 = 1×0.125 + 0×0.0625 + 1×0.03125 = 0.125 + 0 . 03125 = 0,15625.

3.1 Numere speciale: zero, infinit și incertitudine
În IEEE754, numărul „0” este reprezentat de o valoare cu un ordin egal cu E=E min -1 (pentru single aceasta este -127) și o mantisă zero. Introducerea lui zero ca număr independent (deoarece zero nu poate fi reprezentat într-o reprezentare normalizată) a făcut posibilă evitarea multor ciudățenii în aritmetică. Și deși operațiunile cu zero trebuie procesate separat, ele sunt de obicei efectuate mai rapid decât cu numerele obișnuite.

IEEE754 oferă, de asemenea, o reprezentare pentru numere speciale, a căror funcționare provoacă o excepție. Aceste numere includ infinitul (±∞) și incertitudinea (NaN). Aceste numere vă permit să returnați o valoare adecvată în caz de depășire. Infiniturile sunt reprezentate ca numere cu ordinul E=E max +1 și mantisa zero. Puteți obține infinitul prin depășire și prin împărțirea unui număr diferit de zero la zero. Dezvoltatorii au determinat infinitul în diviziune pe baza existenței unor limite atunci când dividendul și divizorul tind la un anumit număr. În consecință, c/0==±∞ (de exemplu, 3/0=+∞ și -3/0=-∞), deoarece dacă dividendul tinde spre o constantă și divizorul tinde spre zero, limita este egală cu infinit. La 0/0 nu există limită, deci rezultatul va fi incertitudine.

Incertitudine sau NaN (de la nu un număr) este o reprezentare inventată cu scopul de a operație aritmetică ar putea returna întotdeauna o valoare fără sens. În IEEE754, NaN este reprezentat ca un număr în care E=E max +1 și mantisa este diferită de zero. Orice operație cu NaN returnează NaN. Dacă doriți, puteți scrie informații în mantise pe care programul le poate interpreta. Acest lucru nu este specificat de standard și mantisa este cel mai adesea ignorată.

Cum poți obține NaN? Într-unul din următoarele moduri:

  • ∞+(- ∞)
  • 0 × ∞
  • 0/0, ∞/∞
  • sqrt(x), unde x<0
Prin definiție, NaN ≠ NaN, prin urmare, pentru a verifica valoarea unei variabile, trebuie doar să o comparați cu ea însăși.
De ce zero are un semn (sau +0 vs -0)
Cititorul iscoditor a observat probabil deja că în reprezentarea descrisă a numerelor în virgulă mobilă există două zerouri care diferă doar prin semn. Deci, 3·(+0)=+0 și 3·(-0)=-0. Dar când comparăm +0=-0. În standard, semnul a fost reținut în mod deliberat, astfel încât expresiile care, ca urmare a depășirii sau a depășirii, se transformă în infinit sau zero, să poată prezenta cel mai corect rezultat atunci când sunt înmulțite și împărțite. De exemplu, dacă zero nu ar avea semn, expresia 1/(1/x)=x nu ar fi adevărată la x=±∞, deoarece 1/∞ și 1/-∞ sunt egale cu 0.

Inca un exemplu:
(+∞/0) + ∞ = +∞, în timp ce (+∞/-0) +∞ = NaN

De ce este infinitul mai bun decât NaN în acest caz? Pentru că dacă NaN apare într-o expresie aritmetică, rezultatul întregii expresii va fi întotdeauna NaN. Dacă infinitul este întâlnit în expresie, atunci rezultatul poate fi zero, infinit sau un număr obișnuit cu virgulă mobilă. De exemplu, 1/∞=0.

3.3 Numerele denormalizate
Să ne uităm la ce numere denormalizate subnormale sunt folosind un exemplu simplu. Să avem o reprezentare normalizată cu o lungime a mantisei |M|=2 biți (+ un bit de normalizare) și un interval de valori de ordinul -1≤E≤2. În acest caz, obținem 16 numere:

Trazele mari arată numere cu o mantisă egală cu 1,00. Se poate observa că distanța de la zero la cel mai apropiat număr (0 - 0,5) este mai mare decât de la acest număr la următorul (0,5 - 0,625). Aceasta înseamnă că diferența dintre oricare două numere de la 0,5 la 1 va da 0, chiar dacă aceste numere nu sunt egale. Ceea ce este și mai rău este că diferența dintre numerele mai mari decât 1 se încadrează în decalajul dintre 0,5 și 0. De exemplu, „1,5-1,25=0” (vezi imaginea).

Nu orice program se încadrează în „gaura aproape de zero”. Conform statisticilor din anii 70, în medie, fiecare computer întâmpina această problemă o dată pe lună. Având în vedere că computerele deveneau răspândite, dezvoltatorii K-C-S au considerat această problemă suficient de serioasă pentru a fi rezolvată la nivel hardware. Soluția propusă de ei a fost următoarea. Știm că cu E=E min -1 (pentru float acesta este „-127”) și o mantisă zero, numărul este considerat egal cu zero. Dacă mantisa nu este zero, atunci numărul este considerat nu zero, ordinea sa este setată la E=E min , iar bitul înalt implicit al mantisei este setat la zero. Se numesc astfel de numere denormalizat.

Strict vorbind, numerele în virgulă mobilă arată acum astfel:

(-1) s × 1.M × 2 E dacă E min ≤E≤E max (numere normalizate)

(-1) s × 0.M × 2 Emin dacă E=E min -1. (numere denormalizate)

Să revenim la exemplu. E minul nostru =-1. Să introducem o nouă valoare de ordine, E=-2, la care numerele sunt denormalizate. Ca rezultat, obținem o nouă reprezentare a numerelor:

Intervalul de la 0 la 0,5 este umplut cu numere denormalizate, ceea ce face posibil să nu eșueze în cele 0 exemple discutate mai sus (0,5-0,25 și 1,5-1,25). Acest lucru a făcut reprezentarea mai robustă la erorile de rotunjire pentru numere apropiate de zero.

Dar luxul de a folosi o reprezentare denormalizată a numerelor în procesor nu vine gratuit. Deoarece astfel de numere trebuie să fie tratate diferit în toate operațiunile aritmetice, este dificil să faci o astfel de aritmetică să funcționeze eficient. Acest lucru impune dificultăți suplimentare la implementarea ALU-urilor în procesor. Și, în timp ce numerele denormalizate sunt foarte utile, ele nu sunt un panaceu și rotunjirea la zero încă trebuie să fie îngrijită. Prin urmare, această funcționalitate a devenit o piatră de poticnire în timpul dezvoltării standardului și a întâlnit cea mai puternică rezistență.

3.4 Ordinea numerelor în IEEE754
Una dintre caracteristicile uimitoare ale reprezentării numerelor IEEE754 este că exponentul și mantisa sunt aranjate unul după altul în așa fel încât împreună formează o secvență de numere întregi (n) pentru care este valabil următoarele:

N

Deci, dacă luăm un număr cu virgulă mobilă pozitiv, îl convertim într-un număr întreg, adăugăm „1”, obținem următorul număr care este reprezentabil în această aritmetică. În C poți face așa:

Float a=0,5; int n = *((int*) &a); float b = *((float*) &(++n)); printf("După %e următorul număr: %e, diferență (%e)\n", a, b, b-a);
Acest cod va funcționa numai pe o arhitectură int pe 32 de biți.

4. Capcane în aritmetica în virgulă mobilă

Acum - să exersăm. Să ne uităm la caracteristicile aritmeticii în virgulă mobilă care necesită o atenție specială la programare.
4.1 Rotunjire
Erorile datorate erorilor de rotunjire sunt greu de întâlnit în aritmetica modernă în virgulă mobilă, mai ales când se utilizează precizia dublă. Regula de rotunjire din standardul IEEE754 prevede că rezultatul oricărei operații aritmetice trebuie să fie ca și cum ar fi fost efectuat pe valorile exacte și rotunjit la cel mai apropiat număr reprezentabil în formatul respectiv. Acest lucru necesită efort suplimentar din partea ALU, iar unele opțiuni ale compilatorului (cum ar fi „-ffast-math” în gcc) pot dezactiva acest comportament. Caracteristici de rotunjire IEEE754:
  • Rotunjirea la cea mai apropiată din standard se face altfel decât suntem obișnuiți. S-a arătat matematic că dacă 0,5 este rotunjit la 1 (în sus), atunci există un set de operații în care eroarea de rotunjire va crește la infinit. Prin urmare, IEEE754 folosește regula rotunjită la egală. Deci, 12,5 va fi rotunjit la 12, iar 13,5 va fi rotunjit la 14.
  • Cea mai periculoasă operație în ceea ce privește rotunjirea în aritmetica în virgulă mobilă este scăderea. La scăderea numerelor apropiate, se pot pierde cifre semnificative, ceea ce
    poate crește eroarea relativă de mai multe ori.
  • Pentru multe formule matematice utilizate pe scară largă, matematicienii au dezvoltat o formă specială care poate reduce semnificativ erorile de rotunjire. De exemplu, este mai bine să calculați formula „x 2 -y 2” folosind formula „(x-y)(x+y)”.
4.2 Neasociativitatea operațiilor aritmetice
În aritmetica cu virgulă mobilă, regula (a*b)*c = a*(b*c) nu este valabilă pentru nicio operație aritmetică. De exemplu,

(10 20 +1)-10 20 =0 ≠ (10 20 -10 20)+1=1

Să presupunem că avem un program pentru însumarea numerelor.

s dublu = 0,0; pentru (int i=0; i Unii compilatori pot rescrie implicit codul pentru a utiliza mai multe ALU în același timp (presupunând că n este divizibil cu 2):

Double sa, s; sa=sa=0,0; pentru (int i=0; i Deoarece operațiile de sumă nu sunt asociative, cele două programe pot produce rezultate diferite.

4.3 Constante numerice
Amintiți-vă că nu toate numerele zecimale au o reprezentare binară în virgulă mobilă. De exemplu, numărul „0,2” ar fi reprezentat ca „0,200000003” cu precizie unică. În consecință, „0,2 + 0,2 ≈ 0,4”. Eroare absolută la individ
În acest caz, poate să nu fie mare, dar dacă folosim o astfel de constantă într-o buclă, putem obține eroarea acumulată.
4.4 Selectarea minimului a două valori
Să presupunem că trebuie să alegem minimul dintre două valori. În C, acest lucru se poate face în unul dintre următoarele moduri:
  1. X< y? x: y
  2. X<= y? x: y
  3. x > y? y:x
  4. x >= y? y:x
Adesea compilatorul le consideră echivalente și folosește întotdeauna prima opțiune, deoarece este executată într-o instrucțiune de procesor. Dar dacă luăm în considerare ±0 și NaN, aceste operații nu sunt în niciun fel echivalente:
X y X< y? x: y X<= y? x: y x > y? y:x x >= y? y:x
+0 -0 -0 +0 +0 -0
NaN 1 1 1 NaN NaN
4.5 Compararea numerelor
O greșeală foarte frecventă când se lucrează cu flotoare apare atunci când se verifică egalitatea. De exemplu,

Float fValue = 0,2; if (fValue == 0,2) DoStuff();
Eroarea aici este, în primul rând, că 0,2 nu are o reprezentare binară exactă, iar în al doilea rând, 0,2 este o constantă de dublă precizie, iar variabila fValue este simplă și nu există nicio garanție cu privire la comportamentul acestei comparații.

Cea mai bună, dar totuși eronată, este de a compara diferența cu eroarea absolută permisă:

Dacă (fabs(fValue – fExpected)< 0.0001) DoStuff(); // fValue=fExpected?

Dezavantajul acestei abordări este că eroarea în reprezentarea unui număr crește pe măsură ce numărul în sine crește. Deci, dacă programul așteaptă „10000”, atunci egalitatea de mai sus nu va fi valabilă pentru cel mai apropiat număr vecin (10000,000977). Acest lucru este valabil mai ales dacă programul conține o conversie de la precizie simplă la precizie dublă.

Alegerea corectă a procedurii de comparare este dificilă și trimit cititorii interesați la articolul lui Bruce Dawson. Acesta propune compararea numerelor în virgulă mobilă prin conversia lor într-o variabilă întreagă. Acesta este cel mai bun mod, deși nu portabil:

Bool AlmostEqual2sComplement(float A, float B, int maxUlps) ( // maxUlps nu trebuie să fie negativ și nu prea mare, astfel încât // NaN să nu fie egal cu niciun număr assert(maxUlps > 0 && maxUlps< 4 * 1024 * 1024); int aInt = *(int*)&A; // Уберем знак в aInt, если есть, чтобы получить правильно упорядоченную последовательность if (aInt < 0) aInt = 0x80000000 - aInt; //aInt &= 0x7fffffff; //(см. комментарий пользователя Vayun) // Аналогично для bInt int bInt = *(int*)&B; if (bInt < 0) bInt = 0x80000000 - bInt; /*aInt &= 0x7fffffff;*/ unsigned int intDiff = abs(aInt - bInt); /*(см. комментарий пользователя Vayun)*/ if (intDiff <= maxUlps) return true; return false; }

În acest program, maxUlps (de la Units-In-Last-Place) este numărul maxim de numere în virgulă mobilă care se pot situa între valoarea testată și valoarea așteptată. O altă semnificație a acestei variabile este numărul de cifre binare (începând cu cele mai puțin semnificative) din numerele comparate care pot fi omise. De exemplu, maxUlps=16 înseamnă că cei 4 biți inferiori (log 2 16) s-ar putea să nu se potrivească, dar numerele vor fi în continuare considerate egale. În acest caz, în comparație cu numărul 10000, eroarea absolută va fi egală cu 0,0146, iar în comparație cu 0,001, eroarea va fi mai mică de 0,00000001 (10 -8).

5. Verificarea caracterului complet al suportului IEE754

Credeți că dacă procesoarele respectă pe deplin standardul IEEE754, atunci orice program care utilizează tipuri de date standard (cum ar fi float/double în C) va produce același rezultat pe computere diferite? Nu aveți dreptate. Portabilitatea și conformitatea cu standardul sunt afectate de opțiunile de compilare și de optimizare. William Kahan a scris un program în C (există și o versiune pentru Fortran) care vă permite să verificați dacă combinația „arhitectură + compilator + opțiuni” satisface IEEE754. Se numește „Paranoia în virgulă mobilă” și textele sale sursă sunt disponibile pentru descărcare. Un program similar este disponibil pentru GPU-uri. De exemplu, Intel Compiler (icc) utilizează implicit modelul IEEE754 „relaxat” și, ca urmare, nu rulează toate testele. Opțiunea „-fp-model precise” vă permite să compilați programul exact la standard. Compilatorul GCC are o opțiune „-ffast-math” care cauzează neconformitatea IEEE754.

Concluzie

În sfârșit, o poveste instructivă. Când lucram la un proiect de testare pe GPU, aveam o versiune în serie și paralelă a aceluiași program. După ce am comparat timpul de execuție, am fost foarte fericit pentru că am primit o accelerare de 300x. Dar mai târziu s-a dovedit că calculele pe GPU „s-au destramat” și s-au transformat în NaN, iar lucrul cu ele în GPU a fost mai rapid decât cu numerele obișnuite. Un alt lucru a fost interesant - același program de pe emulator GPU (pe CPU) a produs rezultatul corect, dar pe GPU în sine nu. Ulterior s-a dovedit că problema a fost că acest GPU nu suporta pe deplin standardul IEEE754 și abordarea directă nu a funcționat.

Aritmetica în virgulă mobilă este acum aproape perfectă. Aproape întotdeauna, o abordare naivă va funcționa, iar un program care nu ia în considerare toate caracteristicile sale va produce rezultatul corect, iar capcanele descrise se referă doar la cazuri exotice. Dar trebuie să rămâneți mereu vigilenți: într-o chestiune precum matematica computerizată este ușor să călcați pe greblă.
!