Tworzenie zmiennych zmiennoprzecinkowych i podwójnych w VEXcode Pro V5

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:

  1. Zajmuje 2X typu float.
  2. 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.

codenippet3.png

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

For more information, help, and tips, check out the many resources at VEX Professional Development Plus