Δημιουργία μεταβλητών Float και Double στο VEXcode Pro V5

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.

Τύποι που περιέχουν αριθμούς με δεκαδικά ψηφία – float, double

Αυτοί οι τύποι δεδομένων ονομάζονται συχνά τύποι δεδομένων κινητής υποδιαστολής. Οι αριθμοί αναφέρονται ως αριθμοί με κινητή υποδιαστολή .

float fvar = 50,15;
διπλό dvar = 50,0;

Σύγκριση τύπων δεδομένων κινητής υποδιαστολής – float και double

Η διαφορά μεταξύ ενός τύπου δεδομένων float και ενός double έγκειται στην ακρίβεια στον αριθμό των δεκαδικών ψηφίων.

Με βάση την προδιαγραφή VexOS – ARM 7, το float μπορεί να χειριστεί 6 ή 7 θέσεις και το double μπορεί να χειριστεί 15 ή 16.

float: στα τρέχοντα V5os, ο ελεγκτής φαίνεται να επιτρέπει ακρίβεια έως και 8 δεκαδικών ψηφίων.

π.χ.

μεταβλητή fvar1 = 1,12345670;
μεταβλητή fvar2 = 1,12345678;

Το fval1 είναι διαφορετικό από το fvar2,

εναντίον

μεταβλητή fvar1 = 1,123456780; 
μεταβλητή fvar2 = 1,123456781;

Το fval1 θα αξιολογηθεί με τον ίδιο τρόπο όπως το fvar2.

διπλό: επιτρέπει ακρίβεια έως και 17 δεκαδικών ψηφίων.

π.χ.

διπλό dvar1 = 1,12345678912345678;
διπλό dvar2 = 1,12345678912345670;

Το dval1 διαφέρει από το dvar2,

εναντίον

διπλό dvar1 = 1,123456789123456789;
διπλό dvar2 = 1,123456789123456780;

Το dval1 θα αξιολογηθεί με τον ίδιο τρόπο όπως το dvar2.


Μην χρησιμοποιείτε "διπλό" εκτός αν χρειάζεστε υψηλή ακρίβεια

Υπάρχουν δύο λόγοι για τους οποίους δεν πρέπει να χρησιμοποιείτε τη συνάρτηση "διπλό" εκτός εάν χρειάζεστε υψηλή ακρίβεια:

  1. Καταλαμβάνει 2X τύπο πλωτήρα.
  2. Καταναλώνει πολύ μεγαλύτερη επεξεργαστική ισχύ.

Με βάση την προδιαγραφή VexOS – ARM 7, ένα φλοτέρ μπορεί να χειριστεί 6 ή 7 θέσεις και ένα διπλό μπορεί να χειριστεί 15 ή 16. Σε κάθε περίπτωση, δεν πρέπει να βασίζεστε στην ακρίβεια των τελευταίων ψηφίων στο double ή float. Αποθηκεύεται πολύ διαφορετικά από την αποθήκευση ενός "int" λόγω κάτι που ονομάζεται "υπολογισμός float-point" (το οποίο είναι εκτός του πεδίου εφαρμογής αυτού του άρθρου).

Έτσι, ενδέχεται να χάσετε την ακρίβεια στα τελευταία δεκαδικά ψηφία.

Η λειτουργία σε double είναι αρκετά δαπανηρή σε σύγκριση με την float, και πολύ υψηλότερη από την "integer" λόγω κάτι που ονομάζεται υπολογισμοί κινητής υποδιαστολής.

Με βάση το πρότυπο IEEE, τα ακόλουθα βρίσκονται εντός ενός πιο αξιόπιστου εύρους.

Τύπος Μικρότερη θετική τιμή Μεγαλύτερη θετική τιμή # Ακρίβειας
φλοτέρ 10 -38 x 1,17549 10 38 x 3,40282 6 ψηφία
διπλό 10 -308 ή 2,22507 10 308 x 1,79769 15 ψηφία

Μπορείτε να ανταλλάξετε πρωτόγονους τύπους δεδομένων; - Κάστινγκ

Είναι δυνατή η ανταλλαγή τύπων δεδομένων. Αυτή η τεχνική ονομάζεται «Χύτευση». Ενώ η χύτευση είναι μια αρκετά συνηθισμένη πρακτική, κάντε την μόνο εάν είναι απαραίτητο. 

Μία από τις πιο συνηθισμένες πρακτικές είναι η ανταλλαγή char και int.

Αυτό συμβαίνει επειδή και οι δύο αντιπροσωπεύουν ακέραιες τιμές με μία εξαίρεση: 

  • Το "int" περιέχει 4 bytes (ή 8 bytes σε κάποιους μεταγλωττιστές)
  • Το "char" περιέχει μόνο 1 byte.

Έτσι, π.χ.

char aVal = 100;
int iVal = aVal; // σιωπηρή χύτευση

ή

int iVal = (char) aVal; // ρητή μετατροπή.

Προσοχή για έμμεση περικοπή:

π.χ.

#include "vex.h"

using namespace vex;

int main() {
  // Αρχικοποίηση διαμόρφωσης ρομπότ. ΜΗΝ ΤΟ ΑΦΑΙΡΕΙΤΕ!
  vexcodeInit();

  int iVal = 128;
  char aVal = (char) iVal; // ΚΑΚΟΣ!!!  Η aVal μπορεί να κρατήσει μόνο από -128 έως 127.

}
Μια άλλη συνηθισμένη πρακτική είναι η ανταλλαγή int και float.
float fVal = 5,486;
float fraction = fVal - (int)fVal; //κάνει: 5,486 - 5

Προσοχή για έμμεση περικοπή:

π.χ.

int iVal = 50;
float fVal = iVal / 100;

τώρα fVal = 0,0, ΟΧΙ 0,5.

Είναι απολύτως εντάξει να εκμεταλλευτείτε την έμμεση περικοπή, η οποία συχνά αποτελεί σημαντικό μέρος των λειτουργιών σε ορισμένα σενάρια. Ωστόσο, πρέπει να βεβαιωθείτε ότι χρησιμοποιείτε αυτήν την τεχνική εκ κατασκευής.

Εάν δεν επιθυμείτε να πραγματοποιηθεί έμμεση περικοπή, πρέπει να κάνετε ρητή μετατροπή:

  • έμμεση μετατροπή: μεταβλητή fVal = iVal / 100,0;
  • ρητή μετατροπή: float fVal = (float) iVal / 100

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

Last Updated: