Διαφορά μεταξύ του Float και του Double - ποια πρέπει να χρησιμοποιήσω; Διαφορά μεταξύ

Anonim

(Σημείωση: Αυτό το άρθρο υποθέτει ότι οι αναγνώστες γνωρίζουν τα βασικά της επιστήμης των υπολογιστών)

Πολλοί προγραμματιστές / φοιτητές newbie που είναι εγγεγραμμένοι στην Πληροφορική ρωτούν τις συχνές ερωτήσεις που σχετίζονται με το συγκεκριμένο πεδίο της Πληροφορικής που μελετούν. Τα περισσότερα μαθήματα αρχαρίων ξεκινούν με τα θέματα του αριθμητικού συστήματος που χρησιμοποιείται στους σύγχρονους υπολογιστές, συμπεριλαμβανομένων των δυαδικών , δεκαδικών , οκταδικών και . Αυτές είναι οι μορφές αριθμών ηλεκτρονικών υπολογιστών που είναι οι εσωτερικές αναπαραστάσεις αριθμητικών τιμών σε υπολογιστές (ή αριθμομηχανές και οποιοδήποτε άλλο είδος ψηφιακών υπολογιστών). Αυτές οι τιμές αποθηκεύονται ως "ομαδοποίηση δυαδικών ψηφίων". Όπως γνωρίζουμε, οι υπολογιστές αντιπροσωπεύουν δεδομένα σε σύνολα δυαδικών ψηφίων (δηλαδή σε συνδυασμό

1s

και 0s , όπως 1111 αντιπροσωπεύει το 15 σε δεκαδικό σύστημα), είναι λογικό να διδάσκουμε σχετικά με τις διαφορετικές μορφές αριθμών που χρησιμοποιούνται για να αντιπροσωπεύουν ένα δυναμικό εύρος τιμών, επειδή αποτελούν τα βασικά τμήματα της επεξεργασίας υπολογισμών / αριθμών σε κάθε είδους λειτουργία. Μόλις οριστεί το σύστημα αριθμών στην τάξη (συχνά ανεπαρκώς), οι μαθητές μπαίνουν στον πειρασμό να προχωρήσουν σε διαφορετικές μορφές αριθμών εντός του ίδιου τύπου (δηλαδή, αριθμητική επίπλευσης ) που έχουν κάποια ακρίβεια και εύρος αριθμών. Έτσι, αναγκάζονται να μάθουν τις αποχρώσεις μεταξύ ορισμένων τύπων. Δύο από τους συνηθέστερα χρησιμοποιούμενους τύπους δεδομένων είναι Float και Double , και ενώ στοχεύουν στις ίδιες ανάγκες (π.χ. αριθμητική floating point κάποια διαφορά στην εσωτερική τους εκπροσώπηση και συνολική επίπτωση στον υπολογισμό του προγράμματος. Είναι ατυχές το γεγονός ότι πολλοί προγραμματιστές χάνουν τις αποχρώσεις μεταξύ των τύπων δεδομένων Flat και Double και καταλήγουν να τους καταχρώνται σε μέρη όπου δεν πρέπει να χρησιμοποιηθούν στην πρώτη θέση. Καταλήγοντας τελικά σε εσφαλμένους υπολογισμούς σε άλλα μέρη του προγράμματος.

Σε αυτό το άρθρο, θα σας πω τη διαφορά μεταξύ float και double με τα παραδείγματα κώδικα στη γλώσσα προγραμματισμού C. Ας αρχίσουμε!

Float vs Double … Ποια είναι η συμφωνία;

Το Float και το Double είναι η αναπαράσταση δεδομένων που χρησιμοποιούνται για τις αριθμητικές πράξεις με κυμαινόμενο σημείο, σκεφτείτε τους δεκαδικούς αριθμούς που υπολογίζετε στην τάξη των μαθηματικών, όπως

20. 123

, 16. 23 , 10. 2 , κλπ., Δεν είναι ολόκληροι αριθμοί (π.χ. 2 , 5 , 15 κλπ.). κλάσματα στο δυαδικό. Ως τελικοί δεκαδικοί αριθμοί (δηλ., 20, 123 , 16, 23 κ.λπ.) δεν μπορεί εύκολα να αναπαρασταθεί με μια κανονική δυαδική μορφή (δηλ., Integer). Η κύρια διαφορά μεταξύ του Float και του Double είναι ότι ο πρώτος είναι τα δεδομένα μονού ακριβείας (32 bit), ενώ ο τελευταίος τύπος δεδομένων διπλής ακρίβειας (64 bit). Το διπλό καλείται "διπλό" επειδή είναι βασικά μια έκδοση διπλής ακρίβειας του Float. Εάν υπολογίζετε ένα τεράστιο ποσό (σκεφτείτε τις χιλιάδες των 0 του αριθμού), τότε οι ανακρίβειες θα είναι μικρότερες στο Double και δεν θα χάσετε πολύ ακρίβεια.

Είναι καλύτερο να επεξεργαστούμε χρησιμοποιώντας τα παραδείγματα κώδικα. Το παρακάτω είναι η λειτουργία σε Float και Double μέσω των μαθηματικών λειτουργιών που παρέχονται στη γλώσσα C:

#include

int κύρια () {

float num1 = 1. f / 82;

float num2 = 0.

για το (int i = 0; i <738; ++ i)

num2 + = num1;

printf ("%. 7g n", num2);

διπλό num3 = 1. 0/82;

διπλό num4 = 0;

για το (int i = 0; i <738; ++ i)

num4 + = num3;

printf ("%. 15g n", num4);

getchar ();

}

Εμφανίζει τα ακόλουθα:

9. 000031

8. 99999999999983

Εδώ μπορείτε να δείτε ότι η μικρή διαφορά στην ακρίβεια των Float και Double δίνει μια διαφορετική απάντηση εντελώς, αν και το Double φαίνεται να είναι ακριβέστερο από το Float.

->

ακολουθεί το παράδειγμα της συνάρτησης sqrt () στο C:

#include

#include

int κύριο () {

float num1 = sqrt (2382719676512365. 1230112312312312) ·

διπλό num2 = sqrt (2382719676512365. 1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Δίνει την ακόλουθη έξοδο:

48813108. 000000

48813109. 678778

Εδώ μπορείτε να δείτε ότι η απάντηση στο Double έχει καλύτερη ακρίβεια.

Συνολικά, είναι προτιμότερο να χρησιμοποιήσετε το Double για αριθμητική επίπλευσης, καθώς πολλές τυπικές μαθηματικές λειτουργίες στο C λειτουργούν σε διπλούς και σύγχρονους υπολογιστές είναι εξαιρετικά γρήγοροι και αποδοτικοί για τους υπολογισμούς με διπλό κυμαινόμενο σημείο. Αυτό οδηγεί σε μείωση της ανάγκης χρήσης του Float, εκτός και αν χρειάζεται να λειτουργείτε με πολλούς αριθμούς με κινητά σημεία (σκεφτείτε μεγάλες συστοιχίες με χιλιάδες αριθμούς 0 στους αριθμούς) ή λειτουργείτε σε ένα σύστημα που δεν υποστηρίζει διπλό- (ARM Cortex-M2, Cortex-M4 κ.λπ.) δεν υποστηρίζουν το Double ακόμα, τότε θα πρέπει να χρησιμοποιήσετε το Float. Επιπλέον, ένα πράγμα που πρέπει να θυμάστε είναι ότι ορισμένες μονάδες GPU / CPU λειτουργούν καλύτερα / αποδοτικότερα στην επεξεργασία Float, όπως στον υπολογισμό των φορέων / μήτρας, επομένως ίσως χρειαστεί να ψάξετε στο εγχειρίδιο / τεκμηρίωση του υλικού για να αποφασίσετε καλύτερα ποια θα πρέπει να χρησιμοποιήσετε για μια συγκεκριμένη μηχανή.

Σπανίως υπάρχει λόγος να χρησιμοποιείτε το Float αντί για το Double στον κώδικα που στοχεύει τους σύγχρονους υπολογιστές. Η επιπλέον ακρίβεια στο Double μειώνει, αλλά δεν εξαλείφει, την πιθανότητα στρογγυλοποίησης σφαλμάτων ή άλλης ασάφειας που μπορεί να προκαλέσει προβλήματα σε άλλα μέρη του προγράμματος. Πολλές λειτουργίες μαθηματικών ή φορέων μετατρέπουν και επιστρέφουν Double, οπότε δεν χρειάζεται να μεταφέρετε τους αριθμούς πίσω στο Float, καθώς αυτό μπορεί να χάσει την ακρίβεια.Για μια λεπτομερή ανάλυση σχετικά με την αριθμητική κυμαινόμενου σημείου, συνιστώ ανεπιφύλακτα να διαβάσετε αυτό το εκπληκτικό άρθρο (// docs, oracle.com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).

Περίληψη

Έτσι … συνοπτικά:

Θέσεις όπου πρέπει να χρησιμοποιήσετε το Float:

Αν στοχεύετε υλικό όπου η ακρίβεια είναι μεγαλύτερη από τη διπλή ακρίβεια.

Η εφαρμογή σας χρησιμοποιεί έντονα την αριθμητική επίπλευσης, όπως χιλιάδες αριθμοί με χιλιάδες 0.

  • Κάνετε βελτιστοποίηση πολύ χαμηλού επιπέδου. Για παράδειγμα, χρησιμοποιείτε ειδικές οδηγίες CPU (δηλαδή, SSE, SSE2, AVX κ.λπ.) που λειτουργούν σε πολλαπλούς αριθμούς / συστοιχίες / διανύσματα κάθε φορά.
  • Συμπέρασμα
Σε αυτό το άρθρο έχω επισημάνει τη διαφορά μεταξύ Float και Double και ποια πρέπει να χρησιμοποιηθεί σε συγκεκριμένα σημεία. Αναμφισβήτητα, είναι προτιμότερο να χρησιμοποιείτε το διπλό στις περισσότερες θέσεις τυφλά, ειδικά εάν στοχεύετε σε σύγχρονους υπολογιστές, καθώς οι πιθανότητες χαμηλής απόδοσης λόγω της αριθμητικής διπλασιασμού είναι εξαιρετικά απίθανο. Εάν έχετε οποιεσδήποτε ερωτήσεις, τότε μπορείτε να ζητήσετε από το τμήμα σχολίων παρακάτω!