BETA

Μαθαίνοντας την Java-Floating Point Types [μάθημα 8]

Εικόνα Michail

Συνεχίζουμε τα μαθήματα εκμάθησης της Java, έχοντας ήδη κάνει το πρώτο εισαγωγικό μάθημα και έχοντας δει,πως μπορουμε να εγκαταστήσουμε το NetBeans, προκειμένου να δημιουργήσουμε τις εφαρμογές μας και στη συνεχεια δημιουργώντας την πρωτη μας εφαρμογή.
Έχοντας δει κιόλας, σχετικά με τα LANGUAGE FUNDAMENTALS και στη συνέχεια, Ονομασία Μεταβλητών, και τα INTEGER TYPES, συνεχίζουμε με το 8ο μαθημα της σειράς.
[box color=blue]Σε αυτή την φάση για τα εκπαιδευτικά μαθήματα χρησιμοποιούμε το λειτουργικό σύστημα Windows, μα οι διαφορές είναι ελάχιστες, ως μηδαμινές και στα υπόλοιπα λειτουργικά[/box]
Στο σημερινό μάθημα θα μιλήσουμε για τις δύο κατηγορίες δεκαδικών τις οποίες προσφέρει η Java για τις αριθμητικές πράξεις – float και double.
Οι δεκαδικοί είναι η δεύτερη κατά σειρά κατηγορία που περιγράφεται στο online tutorial της java.
Η μόνη διαφορά ανάμεσά στα δύο είδη είναι το εύρος των τιμών τις οποίες έχουν την δυνατότητα να περιγράψουν.
Οι float αριθμοί περιγράφονται με 32 bits ενώ οι double αριθμοί με 64 bits και κατά συνέπεια μπορούν να καλύψουν το διπλάσιο εύρος αριθμών.
Ο πίνακας που ακολουθεί περιγράφει κατά προσέγγιση το μέγεθος των αριθμών:

Ορίζουμε floating-point μεταβλητές με τον ίδιο τρόπο όπως και κάνουμε και με τους ακεραίους. Για παράδειγμα, για να ορίσουμε μια double μεταβλητή με το όνομα temperature γράφουμε τον εξής ορισμό:

double temperature = 36.80;

Το όνομα double αναφέρεται (όπως ήδη έχετε υποψιαστεί) στο γεγονός ότι οι αριθμοί που ανήκουν σε αυτή την κατηγορία έχουν δύο φορές μεγαλύτερη δυνατότητα ακρίβειας και εύρους από τους αριθμούς που ανήκουν στην κατηγορία float. Για αυτό το λόγο άλλωστε τις περισσότερες φορές οι προγραμματιστές επιλέγουν να χρησιμοποιήσουν double αριθμούς παρά float.

Υπάρχει μια ιδιαιτερότητα όσον αφορά τον ορισμό των float αριθμών – συνοδεύονται από τον χαρακτήρα F αμέσως μετά από τον τιμή.
Ο λόγος αυτού του διαχωρισμού βρίσκεται στο γεγονός ότι η java όλους τους δεκαδικούς αριθμούς τους μεταχειρίζεται σαν double.
Εάν θέλετε να ορίσετε ένα float αριθμό θα πρέπει να χρησιμοποιήσετε όχι μόνο την λέξη float αλλά και το F στο τέλος της αριθμητικής τιμής.
Αν θυμάστε, είχαμε δει την ίδια συμπεριφορά στην java η οποία θεωρούσε όλους τους αριθμούς σαν int εκτός και εάν ορίζαμε ένα L στο τέλος για να ορίσουμε τον αριθμό σαν long.
Για παράδειγμα, για να ορίσουμε την μεταβλητή x σαν float και να της αναθέσουμε την τιμή 86.562 θα πρέπει να γράψουμε:

float x = 86.562F;

Εάν θέλετε, μπορείτε να προσθέσετε τον χαρακτήρα D μετά από τον ορισμό ενός double αριθμού αλλά αυτή η δήλωση είναι εντελώς προαιρετική.
Για να κατανοήσετε καλύτερα όμως κάποιες δυσκολίες που ίσως συναντήσετε στην χρήση των δύο αυτών κατηγοριών ας μελετήσουμε ένα συγκεκριμένο πρόγραμμα.
Σας υπενθυμίζω ότι θα χρειαστεί σαν πρώτο βήμα να δημιουργήσετε ένα καινούργιο project, έπειτα ένα πακέτο και τέλος μια κλάση μέσα στο πακέτο.
Στο δικό μας παράδειγμα και για περισσότερη ευκολία έχω ονομάσει το project, το πακέτο και την κλάση με το ίδιο όνομα – FloatTest.

Line 7 – Ορίζουμε τον αριθμό 3.14159 σαν double.

Line 8 – Επειδή η Java έχει την ιδιότητα να θεωρεί όλους τους δεκαδικούς αριθμούς σαν double για να ορίσουμε την μεταβλητή f σαν float θα πρέπει εκτός από την λέξη float μπροστά από την μεταβλητή να προσθέσουμε και το χαρακτήρα F μετά το τέλος της τιμής.

Line 13 – Επειδή οι αριθμοί 15 και 4 είναι και οι δύο ακέραιοι, το πηλίκο της διαίρεσης είναι και αυτό ακέραιος με αποτέλεσμα 3. Το υπόλοιπο της διαίρεσης δεν υπολογίζεται.
Επειδή η μεταβλητή f περιμένει να “δει” float αριθμό μετατρέπει τον ακέραιο 3 σε 3.0.
Αυτό γίνεται αυτόματα γιατί ένας ακέραιος όταν μετατραπεί σε float δεν χάνει σε ακρίβεια ψηφίων οπότε η java εκτελεί την εντολή αυτόματα (ονομάζεται upcasting).
Αλλά η πράξη της διαίρεσης έχει ήδη δώσει λάθος αποτέλεσμα. Για να διορθώσουμε το πρόβλημα εφαρμόζουμε την τεχνική της μετατροπής (casting) σε μια από τις δύο μεταβλητές: f = (float) n /d/

Line 17 – Ένας double αριθμός πολλαπλασιάζεται με δύο int.
Πριν την πράξη του πολλαπλασιασμού, οι δύο int τιμές προάγονται σε double και μετά εκτελείτε η αριθμητική πράξη της οποίας το αποτέλεσμα είναι double.

Η Java επίσης έχει τρεις ειδικές floating-point τιμές για να ειδοποιεί τον προγραμματιστή ότι έχουν συμβεί λάθη στις αριθμητικές πράξεις:

  1. Positive infinity
  2. Negative infinity
  3. NaN (not a number)

Για παράδειγμα, το αποτέλεσμα της διαίρεσης ενός θετικού αριθμού με το 0 θα μας δώσει αποτέλεσμα positive infinity.

Από την Java 7, έχουμε την δυνατότητα να τοποθετούμε τον underscore χαρακτήρα ( _ ) οπουδήποτε ανάμεσα στους αριθμούς έτσι ώστε να γίνεται πιο κατανοητός ο τρόπος παρουσίασης τους.
Για παράδειγμα, θα μπορούσατε να χρησιμοποιήσετε τον underscore χαρακτήρα για να χωρίσετε έναν μεγάλο σε αριθμό ψηφίων αριθμό σε ομάδες των 3 ψηφίων.
Κάτι αντίστοιχο που κάνουμε με την χρήση του κόμματος ή της τελείας.

long creditCardNumber = 1234_5678_9012_3456L;

long socialSecurityNumber = 999_99_9999L;

float pi = 3.14_15F;

long hexBytes = 0xFF_EC_DE_5E;

long hexWords = 0xCAFE_BABE;

long maxLong = 0x7fff_ffff_ffff_ffffL;

byte nybbles = 0b0010_0101;

long bytes = 0b11010010_01101001_10010100_10010010;

Μπορείτε να τοποθετήσετε τον undescore χαρακτήρα μόνο ανάμεσα σε ψηφία. Δεν μπορείτε όμως στα ακόλουθα σημεία:

  • Στην αρχή ή στο τέλος του αριθμού
  • μέσως μετά την τελεία σε έναν δεκαδικό αριθμό
  • Πριν από το χαρακτήρα F ή L
  • Και όταν αναμένουμε σαν αποτέλεσμα μια σειρά από ψηφία

Τα πιο κάτω παραδείγματα σας αναλύουν καλύτερα τους κανόνες που μόλις αναφέραμε:

// Invalid: cannot put underscores adjacent to a decimal point

float pi1 = 3_.1415F;

// Invalid: cannot put underscores adjacent to a decimal point

float pi2 = 3._1415F;

// Invalid: cannot put underscores prior to an L suffix

long socialSecurityNumber1 = 999_99_9999_L;

// This is an identifier, not a numeric literal

int x1 = _52;

// OK (decimal literal)

int x2 = 5_2;

// Invalid: cannot put underscores αt the end of a literal

int x3 = 52_;

// OK (decimal literal)

int x4 = 5_______2;

// Invalid: cannot put underscores in the 0x radix prefix

int x5 = 0_x52;

// Invalid: cannot put underscores at the beginning of a number

int x6 = 0x_52;

// OK (hexadecimal literal)

int x7 = 0x5_2;

// Invalid: cannot put underscores at the end of a number

int x8 = 0x52_;

Μιχάλης Κασάπογλου(http://kassapoglou.com)

  • Σχόλια

0 Comments:

Scroll to Top