The VEX Visual Studio Code Extension has replaced VEXcode Pro V5, which is now end-of-life.
VEXcode Blocks and VEXcode Text remain actively developed and supported for all VEX platforms.
Typy przechowujące liczby z miejscami dziesiętnymi – float, double
Te typy danych są często nazywane typami danych zmiennoprzecinkowych. Liczby są określane jako liczb zmiennoprzecinkowych.
float fvar = 50,15;
podwójny dvar = 50,0;
Porównaj typy danych zmiennoprzecinkowych – float i double
Różnica między typem danych float i double polega na precyzji liczby miejsc dziesiętnych.
Na podstawie specyfikacji VexOS – ARM, float może obsługiwać 6 lub 7 miejsc, a double 15 lub 16.
float: w obecnym V5os kontroler wydaje się umożliwiać dokładność do 8 miejsc po przecinku.
np
float fvar1 = 1,12345670;
float fvar2 = 1,12345678;
fval1 różni się od fvar2,
vs
float fvar1 = 1,123456780;
float fvar2 = 1,123456781;
fval1 będzie oceniany tak samo jak fvar2.
double: pozwala na dokładność do 17 miejsc po przecinku.
np
podwójna dvar1 = 1,12345678912345678;
podwójna dvar2 = 1,12345678912345670;
dval1 różni się od dvar2,
vs
podwójna dvar1 = 1,123456789123456789;
podwójna dvar2 = 1,123456789123456780;
dval1 będzie oceniany tak samo jak dvar2.
Nie używaj „double”, chyba że potrzebujesz wysokiej precyzji
Są dwa powody, dla których nie powinieneś używać „podwójnego”, chyba że potrzebujesz dużej precyzji:
- Zajmuje typ pływakowy 2X.
- Zajmuje znacznie większą moc obliczeniową.
Bazując na specyfikacji VexOS – ARM, float może obsłużyć 6 lub 7 miejsc, a double 15 lub 16. W obu przypadkach nie należy polegać na dokładności ostatnich cyfr w przypadku liczb podwójnych lub zmiennoprzecinkowych. Jest przechowywany zupełnie inaczej niż przechowywanie „int” ze względu na coś, co nazywa się „obliczaniem zmiennoprzecinkowym” (co wykracza poza zakres tego artykułu).
Dlatego możesz stracić dokładność kilku ostatnich miejsc po przecinku.
Operacja na liczbie podwójnej jest dość kosztowna w porównaniu z liczbą zmiennoprzecinkową i znacznie wyższa niż „liczba całkowita” ze względu na coś, co nazywa się obliczeniami zmiennoprzecinkowymi.
W oparciu o standard IEEE poniższe wartości mieszczą się w bardziej niezawodnym zakresie.
| Typ | Najmniejsza wartość dodatnia | Największa wartość dodatnia | # precyzji |
|---|---|---|---|
| platforma | 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 zamieniać prymitywne typy danych? - Odlewanie
Istnieje możliwość zamiany typów danych. Technika ta nazywa się „Casting”. Chociaż rzucanie jest dość powszechną praktyką, rób to tylko wtedy, gdy jest to konieczne.
Jedną z najczęstszych praktyk jest zamiana typów char i int.
Dzieje się tak, ponieważ oba 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.
Więc np
znak aWartość = 100;
int iVal = aVal; // niejawne rzutowanie
Lub
int iVal = (char) aVal; // jawne rzutowanie.
Uwaga dotycząca ukrytego obcięcia:
np
#include "vex.h"
using namespace vex;
int main() {
// Inicjalizacja konfiguracji robota. NIE USUWAĆ!
vexcodeInit();
int iVal = 128;
znak aVal = (char) iVal; // ZŁY!!! aVal może pomieścić tylko wartości od -128 do 127.
}Inną powszechną praktyką jest zamiana int i float
pływak fVal = 5,486;
frakcja zmiennoprzecinkowa = fVal - (int)fVal; //działa: 5.486 - 5
Uwaga dotycząca ukrytego obcięcia:
np
int iVal = 50;
pływak fVal = iVal / 100;
teraz fVal = 0,0, NIE 0,5.
Nie ma nic złego w korzystaniu z ukrytego obcięcia, które w niektórych scenariuszach często stanowi ważną część operacji. Musisz jednak upewnić się, że używasz tej techniki zgodnie z projektem.
Jeśli nie chcesz, aby miało miejsce ukryte obcięcie, musisz wykonać jawne rzutowanie:
- niejawne rzutowanie:
float fVal = iVal / 100,0; - jawne rzutowanie:
float fVal = (float) iVal / 100