Pluti și dubla sunt două tipuri de date primitive în programarea C care sunt folosite pentru a stoca valori zecimale . Ambele stochează numere în virgulă mobilă, dar diferă prin nivelul de precizie la care pot stoca valorile.
În acest articol, vom studia fiecare dintre ele în detaliu, reprezentarea lor în memorie și diferența dintre ele.
Pluti
Float este folosit pentru a stoca numere cu virgulă mobilă cu precizie unică. Poate stoca valori zecimale cu precizie de până la 6-7 zecimale.
Sintaxă
float var_name ;>
- Dimensiunea flotorului este 4 octeți.
- Float poate stoca valori care variază de la 3,4 x 10-38la 3,4 x 1038.
- Poate stoca valori de până la 7 zecimale fără pierderi de precizie.
- Specificatorul de format pentru float este %f.
Exemplu
C
șir de comparare java
Citirea fișierului csv în java
// C Program to illustrate float> #include> > int> main()> {> >// Syntax of declaring and initializing> >// the float variable> >float> myVariable = 789.123456f;> > >// printing floating point number> >printf>(>'Float value is %f'>, myVariable);> >return> 0;> }> |
>
>Ieșire
Float value is 789.123474>
După cum puteți vedea în rezultatul de mai sus, precizia numerelor zecimale se pierde după a 7-a cifră din cauza biților limitati în float. În aceste cazuri, se recomandă un tip de date dublu.
Notă: Toate literalele numere reale sunt de tip dublu implicit. Putem atasa un f la sfârșitul literalului pentru a-l defini ca tip float.
Dubla
Double este folosit pentru a stoca valori în virgulă mobilă cu precizie dublă. Este versiunea mai mare a float care poate stoca numere reale cu precizie de până la 15 zecimale.
- Dimensiunea dublului este 8 octeți.
- Gama de dublu este 1,7×10-308la 1,7×10+308.
- Poate stoca valori de până la 15 zecimale fără pierderi de precizie.
- Specificatorul de format pentru double este %lf
Exemplu
C
str la int
#include> > int> main()> {> >// Syntax of declaring and initializing> >// the double variable> >double> myVariable = 789.123456;> >printf>(>'Double value is %lf'>, myVariable);> >//%lf or %f both can be used to> >// print Float values> >return> 0;> }> |
>
arbore binar de căutare
>Ieșire
Double value is 789.123456>
Cum sunt stocate float și double?
Limbajul C urmează Standardul IEEE 754 pentru reprezentarea valorilor în virgulă mobilă în memorie. Spre deosebire de tipul int care este stocat direct în memorie în formă binară, valorile float sunt împărțite în două părți: exponent și mantisă și apoi stocate.
Conform IEEE 754, valorile în virgulă mobilă constau din 3 componente:
- Bit de semn: Acesta reprezintă semnul numărului. 0 reprezintă pozitiv, în timp ce 1 reprezintă negativ. Exponent părtinitor: Exponentul numărului nu poate fi stocat direct, deoarece poate fi atât negativ, cât și pozitiv, așa că folosim un exponent părtinitor în care adăugăm o anumită părtinire la exponent. Mantissa normalizată: Matissa este numărul în notație științifică, adică biți de precizie ai numărului.
C float Reprezentare memorie
Dimensiunea float-ului este de 32 de biți, din care:
- Cel mai semnificativ bit (MSB) este folosit pentru a stoca semn a numărului.
- Urmatorul 8 biți sunt folosite pentru a stoca exponent.
- Restul 23 de biți sunt folosite pentru a stoca mantisa.
Exemplu
Să luăm 65,125 ca număr zecimal pe care dorim să îl stocăm în memorie.
Converting to Binary form, we get: 65 = 1000001 0.125 = 001 So, 65.125 = 1000001.001 = 1.000001001 x 106 Normalized Mantissa = 000001001 Now, according to the standard, we will get the baised exponent by adding the exponent to 127, = 127 + 6 = 133 Baised exponent = 10000101 And the signed bit is 0 (positive) So, the IEEE 754 representation of 65.125 is, 0 10000101 00000100100000000000000>
C dubla reprezentare a memoriei
Dimensiunea float-ului este de 32 de biți, din care:
program c pentru compararea șirurilor
- Cel mai semnificativ bit (MSB) este folosit pentru a stoca semn a numărului.
- Urmatorul 11 biți sunt folosite pentru a stoca exponent.
- Restul 52 de biți sunt folosite pentru a stoca mantisa.
Exemplu
Să luăm exemplul aceluiași număr 65.125,
From above, 65.5 = 1.000001001 x 106 Normalized Mantissa = 000001001 Now, according to the standard, bais is 1023. So, = 1023 + 6 = 1029 Baised exponent = 10000000101 And the signed bit is 0 (positive) So, the IEEE 754 representation of 65.125 is, 0 10000000101 0000010010000000000000000000000000000000000000000000>
Diferențele dintre float și double
Puncte | Pluti | Dubla |
|---|---|---|
| Precizie | Float este virgulă mobilă IEEE 754 cu precizie simplă, care oferă precizie de până la 7 puncte zecimale. | Double este dublă precizie IEEE 754 virgulă flotantă care oferă precizie de până la 15 puncte zecimale. |
| Folosirea memoriei | Float folosește 32 de biți sau 4 octeți de memorie. | Double utilizează 64 de biți sau 8 octeți de memorie. |
| Gamă | Float poate stoca valori care variază de la 3,4 x 10-38la 3,4 x 10+38. | Intervalul de dublu este 1,7×10-308la 1,7×10+308. |
| Specificator de format | %f este specificatorul de format pentru float. | %lf este specificatorul de format pentru double. |
| Reprezentarea memoriei | Semn = 1 bit Exponent = 8 biți Mantissa = 23 de biți | Semn = 1 bit Exponent = 11 biți Mantissa = 52 de biți |
Concluzie
În concluzie, C folosește atât float, cât și double pentru numerele zecimale, dar acestea variază în ceea ce privește precizia, utilizarea memoriei, intervalul și viteza. Când spațiul este limitat și precizia poate fi compromisă, este mai bine să folosiți float acolo, în timp ce dublu este folosit pentru aplicații de înaltă precizie în care spațiul nu este o problemă. Este esențial să alegeți tipul de date adecvat în funcție de cerințele aplicației.