Typy, które przechowują liczby z miejscami dziesiętnymi – float, double
Te typy danych są często nazywane zmiennoprzecinkowymi typami danych. Liczby są określane jako liczb zmiennoprzecinkowych .
zmiennoprzecinkowa fvar = 50,15; podwójny dvar = 50,0;
Porównaj typ danych zmiennoprzecinkowych — float i double
Różnica między typem danych float a double polega na precyzji liczby miejsc dziesiętnych.
W oparciu o specyfikację VexOS — ARM 7, float może obsłużyć 6 lub 7 miejsc, a double może obsłużyć 15 lub 16 .
float: w obecnych V5os kontroler wydaje się zezwalać na precyzję do 8 miejsc po przecinku.
np.
zmiennoprzecinkowa fvar1 = 1.12345670; float fvar2 = 1.12345678;
fval1 jest czymś innym niż fvar2,
vs.
zmiennoprzecinkowa fvar1 = 1.123456780; float fvar2 = 1.123456781;
fval1 będzie oceniane tak samo jak fvar2.
podwójne: pozwala na do 17 miejsc po przecinku.
np.
podwójny dvar1 = 1.12345678912345678; podwójne dvar2 = 1.12345678912345670;
dval1 różni się od dvar2,
vs.
podwójny dvar1 = 1,123456789123456789; podwójne dvar2 = 1.123456789123456780;
dval1 będzie oceniane tak samo jak dvar2.
Nie używaj „podwójnego”, chyba że potrzebujesz wysokiej precyzji
Istnieją dwa powody, dla których nie powinieneś używać „podwójnego”, chyba że potrzebujesz wysokiej precyzji:
- Zajmuje 2X typu float.
- Zajmuje znacznie większą moc obliczeniową.
W oparciu o specyfikację VexOS — ARM 7, pływak może zająć 6 lub 7 miejsc, a podwójny może obsłużyć 15 lub 16. W obu przypadkach nie powinieneś polegać na dokładności ostatnich cyfr w liczbie podwójnej lub zmiennoprzecinkowej. Jest przechowywany zupełnie inaczej niż przechowywanie „int” z powodu czegoś, co nazywa się „obliczeniem zmiennoprzecinkowym” (co wykracza poza zakres tego artykułu).
W ten sposób możesz stracić dokładność w ostatnich kilku miejscach po przecinku.
Operacja na double jest dość kosztowna w porównaniu do liczby zmiennoprzecinkowej i znacznie wyższa niż liczba całkowita ze względu na coś, co nazywa się obliczeniami zmiennoprzecinkowymi.
W oparciu o normę IEEE poniższe wartości mieszczą się w bardziej niezawodnym zakresie.
Rodzaj | Najmniejsza wartość dodatnia | Największa wartość dodatnia | # precyzji |
pływak | 10 -38 x 1,17549 | 10 38 x 3,40282 | 6 cyfr |
podwójnie | 10 -308 lub 2,22507 | 10 308 x 1,79769 | 15 cyfr |
Czy można wymieniać prymitywne typy danych? - Odlew
Istnieje możliwość wymiany typów danych. Ta technika nazywa się „Casting”. Chociaż casting jest dość powszechną praktyką, rób to tylko wtedy, gdy jest to konieczne.
Jedną z najczęstszych praktyk jest wymiana char i int.
Dzieje się tak, ponieważ obie reprezentują wartości całkowite z jednym wyjątkiem:
- „int” zawiera 4 bajty (lub 8 bajtów w niektórych kompilatorach)
- „char” zawiera tylko 1 bajt.
A więc m.in.
char aVal = 100; int iVal = aVal; // niejawne rzucanie
lub
int iVal = (znak) aVal; // jawne rzutowanie.
Przestroga dotycząca niejawnego obcięcia:
np.
Inną powszechną praktyką jest wymiana int i float
pływak fVal = 5,486; float ułamek = fVal - (int)fVal; //robi: 5,486 - 5
Przestroga dotycząca niejawnego obcięcia:
np.
wewn iVal = 50; float fVal = iVal / 100;
teraz fVal = 0.0, NIE 0.5.
Całkowicie w porządku jest skorzystanie z niejawnego obcinania, które często jest ważną częścią operacji w niektórych scenariuszach. Musisz jednak upewnić się, że używasz tej techniki od samego początku.
Jeśli nie chcesz, aby nastąpiło niejawne obcięcie, musisz wykonać rzutowanie jawne:
- rzutowanie niejawne:
float fVal = iVal / 100,0;
- jawne rzutowanie:
float fVal = (float) iVal / 100